{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Adaptive Clustering based Intrusion Detection\n",
    "---\n",
    "<p style=\"font-size: 1.5em; line-height: 1.2em;\">In this notebook, we build an Intrusion Detection System based on our classifier-agnostic Adaptive Clustering approach as presented in our paper: <a href=\"https://homepages.inf.ed.ac.uk/ppatras/pub/infocom21.pdf\" target=\"_blank\">Adaptive Clustering-based Malicious Traffic Classification at the Network Edge</a>. This approach obtains a perfect Accuracy and F1-score of <b>100.0%</b> with a False Alarm Rate of <b>0%</b>, making it the new state-of-the-art approach for intrusion detection.</p>\n",
    "\n",
    "<p style=\"font-size: 1.5em; line-height: 1.2em;\">In this notebook, we will perform a multi-label classification task on the preprocessed <a href=\"https://registry.opendata.aws/cse-cic-ids2018/\" target=\"_blank\">CSE-CIC-IDS 2018</a> dataset.</p>\n",
    "<p style=\"padding-left: 10px; margin-left: 20px; border-left: 5px solid #CCC; font-style: italic;\">\n",
    "Iman Sharafaldin, Arash Habibi Lashkari, and Ali A. Ghorbani, “Toward Generating a New Intrusion Detection Dataset and Intrusion Traffic Characterization”, 4th International Conference on Information Systems Security and Privacy (ICISSP), Portugal, January 2018\n",
    "</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#!/usr/bin/env python\n",
    "\n",
    "__author__ = \"Alec F.\"\n",
    "__license__ = \"GPL\"\n",
    "__version__ = \"1.0.1\"\n",
    "\n",
    "\n",
    "import os\n",
    "import sys\n",
    "\n",
    "from core.models.network import AdaptiveClustering\n",
    "from core.utils.misc import extend_dataset\n",
    "from core.utils import Dataset\n",
    "\n",
    "import json\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import pickle as pkl\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from torch.autograd import Variable\n",
    "\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "from core.models.RandomForest import RandomForest\n",
    "from sklearn.metrics import confusion_matrix, precision_recall_fscore_support as prf, accuracy_score\n",
    "\n",
    "from pprint import pprint"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Helpers\n",
    "\n",
    "We use these helpers functions throughout all our experiments for simplify our main code and improve its readability. In all our experiments, our datasets are separated to approximately obtain a 70/30 train-test split from randomly sampled data. We use the pickle library to save our trained model and defined a set of metrics that are commonly used for classification tasks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_dataset(dataset_path):\n",
    "    global categories\n",
    "    if not os.path.exists(dataset_path):\n",
    "        print(f\"Dataset not found: {dataset_path}\")\n",
    "        sys.exit(1)\n",
    "\n",
    "    df = pd.read_csv(dataset_path, index_col=False)\n",
    "    \n",
    "    # For binary classification, uncomment the following line\n",
    "    # df['Label'] = np.where(df['Label'] != \"Normal\", \"Attack\", df['Label'])\n",
    "    \n",
    "    train_test_split = .7\n",
    "    msk = np.random.rand(len(df)) < train_test_split\n",
    "    train_df = df[msk]\n",
    "    test_df = df[~msk]\n",
    "\n",
    "    return train_df, test_df, df\n",
    "\n",
    "\n",
    "def save_model(rf, filename):\n",
    "    with open(filename, 'wb') as f:\n",
    "        pkl.dump(rf, f)\n",
    "\n",
    "\n",
    "def load_model(filename):\n",
    "    with open(filename, 'rb') as f:\n",
    "        m = pkl.load(f)\n",
    "    return m\n",
    "\n",
    "\n",
    "class metrics(object):\n",
    "\n",
    "    def __init__(self, tp=None, tn=None, fp=None, fn=None):\n",
    "        super(metrics, self).__init__()\n",
    "\n",
    "        self.tp, self.tn, self.fp, self.fn = tp, tn, fp, fn\n",
    "\n",
    "        self.metrics = {}\n",
    "\n",
    "    def accuracy(self):\n",
    "        return (self.tp + self.tn) / (self.tp + self.tn + self.fp + self.fn)\n",
    "\n",
    "    def detection_rate(self):\n",
    "        return self.tp / (self.tp + self.fn)\n",
    "\n",
    "    def false_alarm_rate(self):\n",
    "        return self.fp / (self.fp + self.tn)\n",
    "\n",
    "    def precision(self):\n",
    "        return self.tp / (self.tp + self.fp)\n",
    "\n",
    "    def f1(self):\n",
    "        prec = self.precision()\n",
    "        rec = self.detection_rate()\n",
    "        return 0 if (prec + rec) == 0 else 2 * (prec * rec) / (prec + rec)\n",
    "\n",
    "    def get_metrics(self):\n",
    "        self.metrics = {\"Acc\": self.accuracy(), \"DR/Recall\": self.detection_rate(), \"FAR\": self.false_alarm_rate(),\n",
    "                        \"PRECISION\": self.precision(), \"F1 SCORE\": self.f1()}\n",
    "        return self.metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Adaptive Clustering - training function\n",
    "\n",
    "We train our Adaptive Clustering network by following the exact settings provided in the paper.\n",
    "However, we also implement an early stop mechanism allowing us to stop the training as soon as we achieve an acceptable loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(X, y, lr=1e-4):\n",
    "    batch_size = 1024\n",
    "\n",
    "    model_ = AdaptiveClustering(encoder_dims=[500, 200, 50], n_kernels=len(categories), kernel_size=10)\n",
    "    model_.train()\n",
    "\n",
    "    if torch.cuda.is_available():\n",
    "        model_ = model_.cuda()\n",
    "        X = X.cuda()\n",
    "        y = y.cuda()\n",
    "\n",
    "    ds = Dataset(X, y)\n",
    "    dl = DataLoader(ds, batch_size=batch_size, shuffle=True, num_workers=2)\n",
    "\n",
    "    n_epoch = 100\n",
    "    optimizer = None\n",
    "\n",
    "    for i in range(n_epoch):\n",
    "        iteration_losses = []\n",
    "        \n",
    "        for x, labels_ in dl:\n",
    "            model_.zero_grad()\n",
    "            _ = model_(x, labels_)\n",
    "            \n",
    "            if optimizer is None:\n",
    "                optimizer = torch.optim.Adam(model_.parameters(), lr=lr)\n",
    "            \n",
    "            loss = model_.loss()\n",
    "            loss_value = loss.item()\n",
    "            \n",
    "            iteration_losses.append(loss_value)\n",
    "            \n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "\n",
    "        print(f\"Iteration {i} | Loss {np.mean(iteration_losses)}\")\n",
    "        if np.mean(iteration_losses) < 1:\n",
    "            print(f\"Early stop triggered at: Iteration {i}\")\n",
    "            break\n",
    "\n",
    "    model_.eval()\n",
    "    return model_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Variables\n",
    "\n",
    "Here we define some global variables to locate our datasets and point to our results directory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "root_path = './'\n",
    "\n",
    "dataset_path = root_path + 'datasets/CICIDS/2018/dataset.csv'\n",
    "extended_dataset_path = root_path + 'datasets/CICIDS/2018/extended_dataset.csv'\n",
    "\n",
    "results_path = root_path + f'results/'\n",
    "if not os.path.exists(results_path):\n",
    "    os.mkdir(results_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_path = results_path + 'trained_model.pkl'\n",
    "separator = \"-\"*50"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dataset\n",
    "### Loading dataset\n",
    "\n",
    "We load the preprocessed dataset as a pandas data frame and show the first few rows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------\n",
      "Loading dataset...\n",
      "Done loading dataset\n"
     ]
    }
   ],
   "source": [
    "print(separator)\n",
    "print(\"Loading dataset...\")\n",
    "if os.path.exists(extended_dataset_path):\n",
    "    train_df, test_df, df = load_dataset(extended_dataset_path)\n",
    "else:\n",
    "    train_df, test_df, df = load_dataset(dataset_path)\n",
    "print(\"Done loading dataset\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Protocol_0</th>\n",
       "      <th>Protocol_6</th>\n",
       "      <th>Protocol_17</th>\n",
       "      <th>Flow Duration</th>\n",
       "      <th>Tot Fwd Pkts</th>\n",
       "      <th>Tot Bwd Pkts</th>\n",
       "      <th>TotLen Fwd Pkts</th>\n",
       "      <th>TotLen Bwd Pkts</th>\n",
       "      <th>Fwd Pkt Len Max</th>\n",
       "      <th>Fwd Pkt Len Min</th>\n",
       "      <th>...</th>\n",
       "      <th>Fwd Seg Size Min</th>\n",
       "      <th>Active Mean</th>\n",
       "      <th>Active Std</th>\n",
       "      <th>Active Max</th>\n",
       "      <th>Active Min</th>\n",
       "      <th>Idle Mean</th>\n",
       "      <th>Idle Std</th>\n",
       "      <th>Idle Max</th>\n",
       "      <th>Idle Min</th>\n",
       "      <th>Label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6500129</td>\n",
       "      <td>15</td>\n",
       "      <td>11</td>\n",
       "      <td>2333.0</td>\n",
       "      <td>4425.0</td>\n",
       "      <td>431.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>20</td>\n",
       "      <td>1.549086</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.549086</td>\n",
       "      <td>1.549086</td>\n",
       "      <td>4.950591</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.950591</td>\n",
       "      <td>4.950591</td>\n",
       "      <td>Brute Force -Web</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6397363</td>\n",
       "      <td>6</td>\n",
       "      <td>8</td>\n",
       "      <td>372.0</td>\n",
       "      <td>9375.0</td>\n",
       "      <td>372.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>20</td>\n",
       "      <td>1.392473</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.392473</td>\n",
       "      <td>1.392473</td>\n",
       "      <td>5.004563</td>\n",
       "      <td>0.0</td>\n",
       "      <td>5.004563</td>\n",
       "      <td>5.004563</td>\n",
       "      <td>Brute Force -Web</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5022931</td>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>599.0</td>\n",
       "      <td>364.0</td>\n",
       "      <td>599.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>20</td>\n",
       "      <td>0.070459</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.070459</td>\n",
       "      <td>0.070459</td>\n",
       "      <td>4.952048</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.952048</td>\n",
       "      <td>4.952048</td>\n",
       "      <td>Brute Force -Web</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5028865</td>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>445.0</td>\n",
       "      <td>1068.0</td>\n",
       "      <td>445.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>20</td>\n",
       "      <td>0.085704</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.085704</td>\n",
       "      <td>0.085704</td>\n",
       "      <td>4.942782</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.942782</td>\n",
       "      <td>4.942782</td>\n",
       "      <td>Brute Force -Web</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5045540</td>\n",
       "      <td>7</td>\n",
       "      <td>6</td>\n",
       "      <td>968.0</td>\n",
       "      <td>1172.0</td>\n",
       "      <td>603.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>20</td>\n",
       "      <td>0.100379</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.100379</td>\n",
       "      <td>0.100379</td>\n",
       "      <td>4.944697</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.944697</td>\n",
       "      <td>4.944697</td>\n",
       "      <td>Brute Force -Web</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 128 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Protocol_0  Protocol_6  Protocol_17  Flow Duration  Tot Fwd Pkts  \\\n",
       "0           0           1            0        6500129            15   \n",
       "1           0           1            0        6397363             6   \n",
       "2           0           1            0        5022931             6   \n",
       "3           0           1            0        5028865             6   \n",
       "4           0           1            0        5045540             7   \n",
       "\n",
       "   Tot Bwd Pkts  TotLen Fwd Pkts  TotLen Bwd Pkts  Fwd Pkt Len Max  \\\n",
       "0            11           2333.0           4425.0            431.0   \n",
       "1             8            372.0           9375.0            372.0   \n",
       "2             5            599.0            364.0            599.0   \n",
       "3             5            445.0           1068.0            445.0   \n",
       "4             6            968.0           1172.0            603.0   \n",
       "\n",
       "   Fwd Pkt Len Min  ...  Fwd Seg Size Min  Active Mean  Active Std  \\\n",
       "0              0.0  ...                20     1.549086         0.0   \n",
       "1              0.0  ...                20     1.392473         0.0   \n",
       "2              0.0  ...                20     0.070459         0.0   \n",
       "3              0.0  ...                20     0.085704         0.0   \n",
       "4              0.0  ...                20     0.100379         0.0   \n",
       "\n",
       "   Active Max  Active Min  Idle Mean  Idle Std  Idle Max  Idle Min  \\\n",
       "0    1.549086    1.549086   4.950591       0.0  4.950591  4.950591   \n",
       "1    1.392473    1.392473   5.004563       0.0  5.004563  5.004563   \n",
       "2    0.070459    0.070459   4.952048       0.0  4.952048  4.952048   \n",
       "3    0.085704    0.085704   4.942782       0.0  4.942782  4.942782   \n",
       "4    0.100379    0.100379   4.944697       0.0  4.944697  4.944697   \n",
       "\n",
       "              Label  \n",
       "0  Brute Force -Web  \n",
       "1  Brute Force -Web  \n",
       "2  Brute Force -Web  \n",
       "3  Brute Force -Web  \n",
       "4  Brute Force -Web  \n",
       "\n",
       "[5 rows x 66 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Preparing the data\n",
    "\n",
    "We prepare the features to be in the correct format for our Adaptive Clustering network and the Random Forest Classifier.\n",
    "\n",
    "The labels are separated from the training features and the order of the categories are kept track of in order to use them in the same order when evaluating the model on the testing set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "if os.path.exists(model_path + \".categories\"):\n",
    "    print(separator)\n",
    "    print(\"Loading categories...\")\n",
    "    with open(model_path + \".categories\", \"r\") as f:\n",
    "        categories = json.load(f)\n",
    "        print(f\"categories loaded: {model_path}.categories\")\n",
    "    print(\"Done loading categories\")\n",
    "else:\n",
    "    categories = list(set(pd.factorize(train_df['Label'])[1].values))\n",
    "\n",
    "train_df_ = train_df.drop(['Label'], axis=1)\n",
    "\n",
    "X = train_df_.values.tolist()\n",
    "y = train_df['Label'].values.tolist()\n",
    "\n",
    "X = torch.FloatTensor(np.array(X))\n",
    "\n",
    "for i, l in enumerate(y):\n",
    "    y[i] = categories.index(l)\n",
    "\n",
    "y = torch.LongTensor(np.array(y))\n",
    "\n",
    "cats = df['Label'].copy()\n",
    "y_ = df['Label'].values\n",
    "df.drop(['Label'], axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Learning"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training the model\n",
    "\n",
    "We train our model until we achieve an acceptable loss and export an extended dataset with the cluster centers obtained from the Adaptive Clustering network. This would allow us to not have to retrain our network for every single execution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training model...\n",
      "Iteration 0 | Loss 13.062225341796875\n",
      "Iteration 1 | Loss 7.7529401135308903\n",
      "Iteration 2 | Loss 5.4764237898764534\n",
      "Iteration 3 | Loss 4.6418090089553231\n",
      "Iteration 4 | Loss 4.1826504430623506\n",
      "Iteration 5 | Loss 3.8153059473740187\n",
      "Iteration 6 | Loss 3.3290569315907264\n",
      "Iteration 7 | Loss 3.0629471855603265\n",
      "Iteration 8 | Loss 2.7290451183323951\n",
      "Iteration 9 | Loss 2.3540818733290655\n",
      "Iteration 10 | Loss 2.0082930641120497\n",
      "Iteration 11 | Loss 1.8502867180323904\n",
      "Iteration 12 | Loss 1.6024695510284395\n",
      "Iteration 13 | Loss 1.4420874083175028\n",
      "Iteration 14 | Loss 1.2183579307042801\n",
      "Iteration 15 | Loss 1.1504769203915032\n",
      "Iteration 16 | Loss 1.0009320416027529\n",
      "Iteration 17 | Loss 0.9703981574850366\n",
      "Early stop triggered at: Iteration 17\n",
      "Done training model\n",
      "Creating extended dataset...\n",
      "Done creating extended dataset\n"
     ]
    }
   ],
   "source": [
    "if not os.path.exists(model_path):\n",
    "    print(\"Training model...\")\n",
    "    model = train(X, y)\n",
    "    print(\"Done training model\")\n",
    "\n",
    "if not os.path.exists(extended_dataset_path):\n",
    "    rf_features, cols = extend_dataset(model, df, cats, label_tag='Label')\n",
    "\n",
    "    del df\n",
    "    del train_df\n",
    "    del test_df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can see here, thanks to our early stopping mechanism, we train our Adaptive Clustering model for only 17 iterations and still obtain a perfect classification accuracy and F-score of __100%__ as shown in the [performance metrics section](#Performance-metrics)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saving new dataset...\n",
      "Done saving new dataset: ./datasets/CICIDS/2018/extended_dataset.csv\n"
     ]
    }
   ],
   "source": [
    "if not os.path.exists(extended_dataset_path):\n",
    "    print(f\"Saving new dataset...\")\n",
    "    new_df = pd.DataFrame(data=rf_features, columns=cols)\n",
    "    new_df.to_csv(extended_dataset_path, index=False)\n",
    "    print(f\"Done saving new dataset: {extended_dataset_path}\")\n",
    "\n",
    "    train_test_split = .7\n",
    "    msk = np.random.rand(len(new_df)) < train_test_split\n",
    "    train_df = new_df[msk]\n",
    "    test_df = new_df[~msk]\n",
    "\n",
    "    df_ = train_df.drop(['Label'], axis=1)\n",
    "\n",
    "    X = df_.values.tolist()\n",
    "\n",
    "    y = train_df['Label'].values.tolist()\n",
    "    for i, l in enumerate(y):\n",
    "        y[i] = categories.index(l)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After obtaining the extended dataset, we train our final classifier and evaluate our Intrusion Detection System."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Random Forest...\n",
      "Done training Random Forest\n",
      "Saving model...\n",
      "Categories saved: ./demo_results/trained_model.pkl.categories\n",
      "Done saving model\n"
     ]
    }
   ],
   "source": [
    "if not os.path.exists(model_path):\n",
    "    print(\"Training Random Forest...\")\n",
    "    model.classifier = RandomForest(n_estimators=200)\n",
    "    model.classifier.fit(X, y)\n",
    "    print(\"Done training Random Forest\")\n",
    "\n",
    "    print(\"Saving model...\")\n",
    "    save_model(model, model_path)\n",
    "    with open(model_path+\".categories\", \"w\") as f:\n",
    "        json.dump(categories, f)\n",
    "        print(f\"Categories saved: {model_path}.categories\")\n",
    "    print(\"Done saving model\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading model...\n",
      "Done loading model\n"
     ]
    }
   ],
   "source": [
    "if os.path.exists(model_path):\n",
    "    print(\"Loading model...\")\n",
    "    model = load_model(model_path)\n",
    "    print(\"Done loading model\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data distributions\n",
    "\n",
    "Here, we print our data distributions per traffic category to verify that we have all categories of our dataset in the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total data distribution: 481257\n",
      "\tBrute Force -XSS: 233\n",
      "\tDDOS-LOIC-UDP: 9645\n",
      "\tFTP-BruteForce: 50000\n",
      "\tSSH-Bruteforce: 50000\n",
      "\tInfiltration: 20633\n",
      "\tDDoS attacks-LOIC-HTTP: 50000\n",
      "\tDoS-Slowloris: 22227\n",
      "\tSQL Injection: 53\n",
      "\tBrute Force -Web: 400\n",
      "\tBenign: 50000\n",
      "\tDoS-SlowHTTPTest: 50000\n",
      "\tDDOS-HOIC: 50000\n",
      "\tBot: 50000\n",
      "\tDoS-GoldenEye: 28066\n",
      "\tDoS-Hulk: 50000\n",
      "Training data distribution: 337073 / 70.04012409170153%\n",
      "\tBrute Force -XSS: 146 / 62.66094420600859%\n",
      "\tDDOS-LOIC-UDP: 6820 / 70.71021254536029%\n",
      "\tFTP-BruteForce: 35031 / 70.062%\n",
      "\tSSH-Bruteforce: 35077 / 70.154%\n",
      "\tInfiltration: 14461 / 70.08675422866283%\n",
      "\tDDoS attacks-LOIC-HTTP: 35111 / 70.222%\n",
      "\tDoS-Slowloris: 15365 / 69.12763755792504%\n",
      "\tSQL Injection: 41 / 77.35849056603773%\n",
      "\tBrute Force -Web: 265 / 66.25%\n",
      "\tBenign: 34919 / 69.838%\n",
      "\tDoS-SlowHTTPTest: 34967 / 69.934%\n",
      "\tDDOS-HOIC: 35089 / 70.178%\n",
      "\tBot: 35174 / 70.348%\n",
      "\tDoS-GoldenEye: 19689 / 70.1524976840305%\n",
      "\tDoS-Hulk: 34918 / 69.836%\n",
      "Testing data distribution: 144184 / 29.95987590829848%\n",
      "\tBrute Force -XSS: 87 / 37.33905579399141%\n",
      "\tDDOS-LOIC-UDP: 2825 / 29.28978745463971%\n",
      "\tFTP-BruteForce: 14969 / 29.938%\n",
      "\tSSH-Bruteforce: 14923 / 29.846%\n",
      "\tInfiltration: 6172 / 29.913245771337177%\n",
      "\tDDoS attacks-LOIC-HTTP: 14889 / 29.778%\n",
      "\tDoS-Slowloris: 6862 / 30.872362442074955%\n",
      "\tSQL Injection: 12 / 22.641509433962263%\n",
      "\tBrute Force -Web: 135 / 33.75%\n",
      "\tBenign: 15081 / 30.162%\n",
      "\tDoS-SlowHTTPTest: 15033 / 30.066%\n",
      "\tDDOS-HOIC: 14911 / 29.822%\n",
      "\tBot: 14826 / 29.652%\n",
      "\tDoS-GoldenEye: 8377 / 29.8475023159695%\n",
      "\tDoS-Hulk: 15082 / 30.164%\n"
     ]
    }
   ],
   "source": [
    "print(f\"Total data distribution: {len(test_df) + len(train_df)}\")\n",
    "total = {}\n",
    "total['total'] = len(test_df) + len(train_df)\n",
    "for cat in categories:\n",
    "    total[cat] = len(test_df[test_df['Label'] == cat]) \\\n",
    "                   + len(train_df[train_df['Label'] == cat])\n",
    "    print(f\"\\t{cat}: {total[cat]}\")\n",
    "\n",
    "print(f\"Training data distribution: {len(train_df)} / {len(train_df) * 100 / total['total']}%\")\n",
    "for cat in categories:\n",
    "    c = len(train_df[train_df['Label'] == cat])\n",
    "    print(f\"\\t{cat}: {c} / {c*100 / total[cat]}%\")\n",
    "print(f\"Testing data distribution: {len(test_df)} / {len(test_df) * 100 / total['total']}%\")\n",
    "for cat in categories:\n",
    "    c = len(test_df[test_df['Label'] == cat])\n",
    "    print(f\"\\t{cat}: {c} / {c * 100 / total[cat]}%\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Testing the model\n",
    "\n",
    "To evaluate our model on the unseen set, we remove the labels and run our trained model on the remaining features."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = test_df.drop(['Label'], axis=1)\n",
    "x = df.values.tolist()\n",
    "\n",
    "y_hat = model.classifier.predict(x)\n",
    "preds = []\n",
    "\n",
    "for i in y_hat:\n",
    "    preds.append(categories[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Confusion matrix\n",
    "\n",
    "We compute the confusion matrix to observe how well our model works on every single category in our test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating confusion matrix...\n",
      "Uniques actual: ['FTP-BruteForce', 'DDOS-HOIC', 'DoS-GoldenEye', 'Bot', 'Benign', 'DoS-Hulk', 'DDOS-LOIC-UDP', 'Brute Force -Web', 'DoS-Slowloris', 'Infiltration', 'DoS-SlowHTTPTest', 'DDoS attacks-LOIC-HTTP', 'SQL Injection', 'SSH-Bruteforce', 'Brute Force -XSS']\n",
      "Uniques preds: ['FTP-BruteForce', 'DDOS-HOIC', 'DoS-GoldenEye', 'Bot', 'Benign', 'DoS-Hulk', 'DDOS-LOIC-UDP', 'Brute Force -Web', 'DoS-Slowloris', 'Infiltration', 'DoS-SlowHTTPTest', 'DDoS attacks-LOIC-HTTP', 'SQL Injection', 'SSH-Bruteforce', 'Brute Force -XSS']\n",
      "Confusion matrix created and saved: ./demo_results/rf_confusion_matrix.csv\n"
     ]
    }
   ],
   "source": [
    "print(\"Creating confusion matrix...\")\n",
    "\n",
    "for i, category in enumerate(categories):\n",
    "    test_df['Label'].replace(to_replace=category, value=i, inplace=True)\n",
    "y_actual_ = test_df['Label'].values.tolist()\n",
    "y_actual = []\n",
    "for i in y_actual_:\n",
    "    y_actual.append(categories[i])\n",
    "\n",
    "print(f\"Uniques actual: {list(set(y_actual))}\")\n",
    "print(f\"Uniques preds: {list(set(preds))}\")\n",
    "\n",
    "y_actu = pd.Series(y_actual, name='Actual')\n",
    "y_pred = pd.Series(preds, name='Predicted')\n",
    "\n",
    "df_confusion = pd.crosstab(y_actu, y_pred, rownames=['Actual'], colnames=['Predicted'],\n",
    "                           dropna=False, margins=False, normalize='index').round(4) * 100\n",
    "\n",
    "df_confusion.to_csv(results_path + 'rf_confusion_matrix.csv')\n",
    "print(f\"Confusion matrix created and saved: {results_path}rf_confusion_matrix.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>Predicted</th>\n",
       "      <th>Benign</th>\n",
       "      <th>Bot</th>\n",
       "      <th>Brute Force -Web</th>\n",
       "      <th>Brute Force -XSS</th>\n",
       "      <th>DDOS-HOIC</th>\n",
       "      <th>DDOS-LOIC-UDP</th>\n",
       "      <th>DDoS attacks-LOIC-HTTP</th>\n",
       "      <th>DoS-GoldenEye</th>\n",
       "      <th>DoS-Hulk</th>\n",
       "      <th>DoS-SlowHTTPTest</th>\n",
       "      <th>DoS-Slowloris</th>\n",
       "      <th>FTP-BruteForce</th>\n",
       "      <th>Infiltration</th>\n",
       "      <th>SQL Injection</th>\n",
       "      <th>SSH-Bruteforce</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Actual</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Benign</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Bot</th>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Brute Force -Web</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Brute Force -XSS</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DDOS-HOIC</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DDOS-LOIC-UDP</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DDoS attacks-LOIC-HTTP</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DoS-GoldenEye</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DoS-Hulk</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DoS-SlowHTTPTest</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DoS-Slowloris</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FTP-BruteForce</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Infiltration</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SQL Injection</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SSH-Bruteforce</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>100.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Predicted               Benign    Bot  Brute Force -Web  Brute Force -XSS  \\\n",
       "Actual                                                                      \n",
       "Benign                   100.0    0.0               0.0               0.0   \n",
       "Bot                        0.0  100.0               0.0               0.0   \n",
       "Brute Force -Web           0.0    0.0             100.0               0.0   \n",
       "Brute Force -XSS           0.0    0.0               0.0             100.0   \n",
       "DDOS-HOIC                  0.0    0.0               0.0               0.0   \n",
       "DDOS-LOIC-UDP              0.0    0.0               0.0               0.0   \n",
       "DDoS attacks-LOIC-HTTP     0.0    0.0               0.0               0.0   \n",
       "DoS-GoldenEye              0.0    0.0               0.0               0.0   \n",
       "DoS-Hulk                   0.0    0.0               0.0               0.0   \n",
       "DoS-SlowHTTPTest           0.0    0.0               0.0               0.0   \n",
       "DoS-Slowloris              0.0    0.0               0.0               0.0   \n",
       "FTP-BruteForce             0.0    0.0               0.0               0.0   \n",
       "Infiltration               0.0    0.0               0.0               0.0   \n",
       "SQL Injection              0.0    0.0               0.0               0.0   \n",
       "SSH-Bruteforce             0.0    0.0               0.0               0.0   \n",
       "\n",
       "Predicted               DDOS-HOIC  DDOS-LOIC-UDP  DDoS attacks-LOIC-HTTP  \\\n",
       "Actual                                                                     \n",
       "Benign                        0.0            0.0                     0.0   \n",
       "Bot                           0.0            0.0                     0.0   \n",
       "Brute Force -Web              0.0            0.0                     0.0   \n",
       "Brute Force -XSS              0.0            0.0                     0.0   \n",
       "DDOS-HOIC                   100.0            0.0                     0.0   \n",
       "DDOS-LOIC-UDP                 0.0          100.0                     0.0   \n",
       "DDoS attacks-LOIC-HTTP        0.0            0.0                   100.0   \n",
       "DoS-GoldenEye                 0.0            0.0                     0.0   \n",
       "DoS-Hulk                      0.0            0.0                     0.0   \n",
       "DoS-SlowHTTPTest              0.0            0.0                     0.0   \n",
       "DoS-Slowloris                 0.0            0.0                     0.0   \n",
       "FTP-BruteForce                0.0            0.0                     0.0   \n",
       "Infiltration                  0.0            0.0                     0.0   \n",
       "SQL Injection                 0.0            0.0                     0.0   \n",
       "SSH-Bruteforce                0.0            0.0                     0.0   \n",
       "\n",
       "Predicted               DoS-GoldenEye  DoS-Hulk  DoS-SlowHTTPTest  \\\n",
       "Actual                                                              \n",
       "Benign                            0.0       0.0               0.0   \n",
       "Bot                               0.0       0.0               0.0   \n",
       "Brute Force -Web                  0.0       0.0               0.0   \n",
       "Brute Force -XSS                  0.0       0.0               0.0   \n",
       "DDOS-HOIC                         0.0       0.0               0.0   \n",
       "DDOS-LOIC-UDP                     0.0       0.0               0.0   \n",
       "DDoS attacks-LOIC-HTTP            0.0       0.0               0.0   \n",
       "DoS-GoldenEye                   100.0       0.0               0.0   \n",
       "DoS-Hulk                          0.0     100.0               0.0   \n",
       "DoS-SlowHTTPTest                  0.0       0.0             100.0   \n",
       "DoS-Slowloris                     0.0       0.0               0.0   \n",
       "FTP-BruteForce                    0.0       0.0               0.0   \n",
       "Infiltration                      0.0       0.0               0.0   \n",
       "SQL Injection                     0.0       0.0               0.0   \n",
       "SSH-Bruteforce                    0.0       0.0               0.0   \n",
       "\n",
       "Predicted               DoS-Slowloris  FTP-BruteForce  Infiltration  \\\n",
       "Actual                                                                \n",
       "Benign                            0.0             0.0           0.0   \n",
       "Bot                               0.0             0.0           0.0   \n",
       "Brute Force -Web                  0.0             0.0           0.0   \n",
       "Brute Force -XSS                  0.0             0.0           0.0   \n",
       "DDOS-HOIC                         0.0             0.0           0.0   \n",
       "DDOS-LOIC-UDP                     0.0             0.0           0.0   \n",
       "DDoS attacks-LOIC-HTTP            0.0             0.0           0.0   \n",
       "DoS-GoldenEye                     0.0             0.0           0.0   \n",
       "DoS-Hulk                          0.0             0.0           0.0   \n",
       "DoS-SlowHTTPTest                  0.0             0.0           0.0   \n",
       "DoS-Slowloris                   100.0             0.0           0.0   \n",
       "FTP-BruteForce                    0.0           100.0           0.0   \n",
       "Infiltration                      0.0             0.0         100.0   \n",
       "SQL Injection                     0.0             0.0           0.0   \n",
       "SSH-Bruteforce                    0.0             0.0           0.0   \n",
       "\n",
       "Predicted               SQL Injection  SSH-Bruteforce  \n",
       "Actual                                                 \n",
       "Benign                            0.0             0.0  \n",
       "Bot                               0.0             0.0  \n",
       "Brute Force -Web                  0.0             0.0  \n",
       "Brute Force -XSS                  0.0             0.0  \n",
       "DDOS-HOIC                         0.0             0.0  \n",
       "DDOS-LOIC-UDP                     0.0             0.0  \n",
       "DDoS attacks-LOIC-HTTP            0.0             0.0  \n",
       "DoS-GoldenEye                     0.0             0.0  \n",
       "DoS-Hulk                          0.0             0.0  \n",
       "DoS-SlowHTTPTest                  0.0             0.0  \n",
       "DoS-Slowloris                     0.0             0.0  \n",
       "FTP-BruteForce                    0.0             0.0  \n",
       "Infiltration                      0.0             0.0  \n",
       "SQL Injection                   100.0             0.0  \n",
       "SSH-Bruteforce                    0.0           100.0  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_confusion"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As mentioned in the paper, and shown by the confusion matrix above, our approach obtains a perfect classification score over the entire test set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Confusion matrix heatmap\n",
    "\n",
    "For a clearer visualization, we plot our confusion matrix as a classification ratio for all different categories and again, observe that we have a perfect classification score on every single category in the entire test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6gAAAJhCAYAAABM0Z3gAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeZgV1ZnH8W8DrUiDhqgJKuuo84rGDSOjIpsmqOCSnYjBKG6jcUYTjDGIoIiaRSNGJrhLlCgxISExJjEuoKAxLlGTccwbtwZaXCOg3TTQQs8fpy4Wl9vd0NTte0/z+zzPfZpbdarqd6tpHt4+p86paGxsRERERERERKTUOpQ6gIiIiIiIiAioQBUREREREZEyoQJVREREREREyoIKVBERERERESkLKlBFRERERESkLKhAFRERERERkbLQqdQBREREREREJB5m9l1glLsf3kybzsA1wJeBLsAfgHPd/a3mzq0eVBEREREREdkkZnYOcMUmNL0BGAF8ERgO9APmtHRQRWNj4xYFFBERERERkfbNzHYFbiQUm0uAfzXVg2pmPYFFwHHu/vtk2x7AS8AQd1/Q1HXUgyoiIiIiIiItOQj4ANgP+EsLbQcRas35uQ3u/jJQAwxp7kA9gyoiIiIiIiLNcvd7gXsBzKyl5rsB77n7yrztS4FezR2oAlVERERERGQrZGYfAz5WYNdyd1++BafuAqwusH010Lm5A1WgihTRdgeeW/YPeS97anqpI4iIiIiUlc6dqCh1hqZk+f/L3nAZMLnArsuAS7fg1PXAtgW2bwvUNnegClQREREREZGt0zRgZoHtW9J7CmESpe5m1tndV6W270p4DrVJKlBFRERERERiUZHdPLfJMN4tLUYLWZh8HQrcD+tn8e0JPNLcgSpQRUREREREYlFRnqOPzawHUOvute6+1MzuBm4ws3GE2X9nAI+4+5+bO4+WmREREREREZEt9QZwQer9mcCDwK+Sr68AX2rpJCpQRSIzaui+vL3w6lLHaNKcX9zDcceMYOCA/Rg7ZjTPP/dsqSNtJIaMoJxZiiEjxJEzhoygnFmKISMoZ5ZiyAjx5MxcRYfsXq3k7qe4++F52yrc/dLU+zp3P8Pdu7v7x9z9q+7+bkvnVoEqEpFD9u/HbVNPpqJMh3bc+5u5TJ0ymVHHHc81066nW7dunH3madTULCl1tPViyAjKmaUYMkIcOWPICMqZpRgygnJmKYaMEE/OoqioyO5VhioaG8t+FQxpx8ysGuiT2rQGWAzcCnzf3TP5C2pmlwKnu3vPLM63qbKaBnybyk6cO2YYk84ZRV39Grap7MTOg8ZncerMlplpbGxk5IgjGTR4MBMnXQZAQ0MDJxx7NEOGDueiCRMzuc6WiCEjKGeWYsgIceSMISMoZ5ZiyAjKmaUYMkLb5CzrZWYO/lZmBVz9Uz8qu8+pHlQpB9OAXZLXXsDE5HVuhte4Gjgww/O1qaMG7c0F40YwYdpcZsxuduKzklm8eBFLl77OsOFHrN9WWVnJ4CHDeGzhghIm+0gMGUE5sxRDRogjZwwZQTmzFENGUM4sxZAR4slZNGUwxLeYNIuvlIM6d38z9f41MxsOnAZcn8UF3L2WFhYFLmfPvLCI/qMms6K2novPGlnqOAUtqq4GoFfvPhts79mzFzVLFrN27Vo6duxYgmQfiSEjKGeWYsgIceSMISMoZ5ZiyAjKmaUYMkI8OYumTIfmZkUFqpSr+vQbMzsemAzsAywF5gCT3X1lsr+RMFPYV4DDgdeBn7r75cn+S0kN8TWz3QnF7xBgBXANcA4w1d1nmtlMoCPwJvD15M8LgHPcfWnRPnUTlr6zoq0vudnqakP9X9WlaoPtVVVVrFu3jvr6erp27VqKaOvFkBGUM0sxZIQ4csaQEZQzSzFkBOXMUgwZIZ6c0jrl2a8rWzUzOxgYA9ycvB8J3APcQihQzwCOBubmHfpD4KfA/sAvgClmNrTA+bsADwGVhGJ2NHAq8G95Tb8C7EhYYHgsoZi9Yos/YDuVe549fwKn3PYOZfDbvhgygnJmKYaMEEfOGDKCcmYphoygnFmKISPEk7No2vkQ3/JMJVubC82sNnmtAZ4EFgGzk/0TgFvcfYa7v+LuDwHjgM+a2QGp89zh7rPc/Z/JMR8AhxW43mjgk8CJ7v6cuy8kFMT5/5rVAme5+4vu/nvgZ02cT4Cu3boBUFdXt8H2lStX0qFDB7br0qUUsTYQQ0ZQzizFkBHiyBlDRlDOLMWQEZQzSzFkhHhyFk07n8VXBaqUg5uBA5LX/oTe0dXA02bWnTC50RmpIrYWmJcc2z91Hl//hzD77/vANgWuNwB4Kb0Ok7v/nTDUN+1Vd29IvV/RxPkE6N0nPAeSP717Tc0S+vbtVxZL48SQEZQzSzFkhDhyxpARlDNLMWQE5cxSDBkhnpzSOipQpRwsc/eXk9eL7n4/cCLQN/naAfgRHxWxudeewO9S51ld4NyF/oX6sInt+Tb1fAL06dOXHj12Yd5DD67f1tDQwIJH5zPwkENLmOwjMWQE5cxSDBkhjpwxZATlzFIMGUE5sxRDRognZ9G08yG+miRJylXuJ6Yj8HfA3P3l3E4z+zRwCXA+YSjv5nge+E8z29Hd/5Wcz4Adtjj1VqyiooJxp5/BVVdczvY77MABBw5g9l2zWL5sGWNPPqXU8YA4MoJyZimGjBBHzhgygnJmKYaMoJxZiiEjxJOzaNp5D7EKVCkHVWbWI/lzBdATuJLwDOivgBpgjpldRngOdBfgJsKQ2+pWXO9u4DJglpldBGzHR8vZZLbw8dZo9IknsWr1au668w5m3TET26s/M266lZ69epU62noxZATlzFIMGSGOnDFkBOXMUgwZQTmzFENGiCenbL6K3GxXIqVgZtVAehGrdcAy4BHgSnd/Jmn3RcLER58ClgP3ARfmniNNlpk5w91vSZ27hjC50qUFlpnpD0wnTHr0HqEgng6Mcfe7k2Vm9nD3w1Pnmwp8zd37burn2+7Ac8v+B2zZU9NLHUFERESkrHTuVL6PdW13+CWZ/f+yfuHlZfc5VaDKVsfM+gL93f0PqW27EtZOHeLuC7K6lgpUERERkfiUdYE6eFJ2BeqCKWX3OTXEV7ZGnYF7zey7wC+BjwFTgZeAJ0oZTERERESkWWU6uVFW2venEynA3f8BfJWw9ukLwIOE510/k7esjIiIiIiItCH1oMpWyd1/Seg9FRERERGJRzvvQVWBKiIiIiIiEosOZffYaKbad/ktIiIiIiIi0VAPqoiIiIiISCw0xFdEWiuGJVy6H3xuqSNskhjupYiIiEjRVWiIr4iIiIiIiEjRqQdVREREREQkFhriKyIiIiIiImVBQ3xFREREREREik8Fqkgk5vziHo47ZgQDB+zH2DGjef65Z0sdqVmjhu7L2wuvLnWMgmK5l8qZnRgyQhw5Y8gIypmlGDKCcmYphowQT87MVXTI7lWGyjOViGzg3t/MZeqUyYw67niumXY93bp14+wzT6OmZkmpoxV0yP79uG3qyVSU4RCUWO6lcmYnhowQR84YMoJyZimGjKCcWYohI8STsygqKrJ7laGKxsbGUmcQKRozqwb6pDatARYDtwLfd/dN+gEwsz7Aoe4+e3Ouv+pDtvgHrLGxkZEjjmTQ4MFMnHQZAA0NDZxw7NEMGTqciyZM3KLzZ7nMzDaVnTh3zDAmnTOKuvo1bFPZiZ0Hjc/k3FksM1Pse5kV5cxODBkhjpwxZATlzFIMGUE5sxRDRmibnJ07UZ7VG7DdUVdnVsDV339B2X1O9aDK1mAasEvy2guYmLw2pzKbBRydfbSWLV68iKVLX2fY8CPWb6usrGTwkGE8tnBBKSI16ahBe3PBuBFMmDaXGbMfKXWcjcRyL5UzOzFkhDhyxpARlDNLMWQE5cxSDBkhnpxF086H+GoWX9ka1Ln7m6n3r5nZcOA04PpNPEfJfru0qLoagF69+2ywvWfPXtQsWczatWvp2LFjCZJt7JkXFtF/1GRW1NZz8VkjSx1nI7HcS+XMTgwZIY6cMWQE5cxSDBlBObMUQ0aIJ2fRlOnQ3KyUZ9ksUnz16TdmdrKZPWdmK82sxsx+aGadk33zgUHA182szcfE19XWAlDVpWqD7VVVVaxbt476+vpCh5XE0ndWsKK2fPLki+VeKmd2YsgIceSMISMoZ5ZiyAjKmaUYMkI8OaV1VKDKVsfMDgbGADcn788HbgFuB/YH/gv4GnBXcsgXgCeBewjDhNtU7jnx/AmHcts7tPPfomUplnupnNmJISPEkTOGjKCcWYohIyhnlmLICPHkLJp2PsS3PFOJZOtCM6tNXmsIxeYiYLaZVQAXATe4+3Xu/pK7/5rwfOrnzWxvd38PaADq84YKt4mu3boBUFdXt8H2lStX0qFDB7br0qWtI0UrlnupnNmJISPEkTOGjKCcWYohIyhnlmLICPHkLJp2PouvClTZGtwMHJC89idMdrQaeBr4BPBJ4NG8Y3Iz/OzXRhmb1LtPeL4if9r0mpol9O3bryyXcilXsdxL5cxODBkhjpwxZATlzFIMGUE5sxRDRognp7SOClTZGixz95eT14vufj9wItAX+M8mjsn9bKxui4DN6dOnLz167MK8hx5cv62hoYEFj85n4CGHljBZfGK5l8qZnRgyQhw5Y8gIypmlGDKCcmYphowQT86iaedDfDWLr2ytcj+R7wFvAUOAX6b2D02+vpB8LdmCwRUVFYw7/QyuuuJytt9hBw44cACz75rF8mXLGHvyKaWKFaVY7qVyZieGjBBHzhgygnJmKYaMoJxZiiEjxJOzaMq0sMyKClTZGlSZWY/kzxVAT+BKoBb4FdAR+IGZvQLcB+wLXAfMdfd/Jsd9APQzsz7uvqhN0wOjTzyJVatXc9eddzDrjpnYXv2ZcdOt9OzVq62jRC+We6mc2YkhI8SRM4aMoJxZiiEjKGeWYsgI8eSUzVeRm+1KpD0ys2ogvUjWOmAZ4RnTK939maTdWcA3gX8D3gBmAZe7+6pk/zHATKAbsIe7L92U66/6sHQ9r5uq+8HnljrCJln21PRSRxAREZGtROdOlO2DrNsdPyOz/1/W//bssvuc6kGVds3d+25iuxuBG5vZ/wfCZEoiIiIiIqXTzof4tu9PJyIiIiIiItFQD6qIiIiIiEgs2vkyOipQRUREREREYqEhviIiIiIiIiLFpx5UERERERGRWGiIr4iIiIiIiJSDChWoItKexbK+aAzrtcZyL0VERETKlQpUERERERGRSKgHVURERERERMpD+65PNYuviIiIiIiIlAf1oIqIiIiIiERCQ3xFRERERESkLLT3AlVDfEUiMecX93DcMSMYOGA/xo4ZzfPPPVvqSAXFkhNg1NB9eXvh1aWO0aRY7mUMOWPICHHkjCEjKGeWYsgIypmlGDJCPDll86hAFYnAvb+Zy9Qpkxl13PFcM+16unXrxtlnnkZNzZJSR9tALDkBDtm/H7dNPblsfwsZy72MIWcMGSGOnDFkBOXMUgwZQTmzFENGiCdnMVRUVGT2KkcVjY2Npc7QLplZNdAntWkNsBi4Ffi+u2/RjTeznYAT3P3WLTjHpcDkJna/4u57tPbcbcHMrgXGAjun76eZ3QicCZzv7teltu8G1AAnuvvsTTj/fKDG3b/W2oyrPmSLf8AaGxsZOeJIBg0ezMRJlwHQ0NDACccezZChw7lowsQtvUQmip0zq3VQt6nsxLljhjHpnFHU1a9hm8pO7DxofCbnzmodVH3PsxNDRogjZwwZQTmzFENGUM4sxZAR2iZn507lO1fuDifemVkBt+LusWX3OdWDWlzTgF2S117AxOSVxf+0c8XZlnqDjzKmX4dkcO5iexDYEbC87UcBS4Bj8rYPBdYlx0Vj8eJFLF36OsOGH7F+W2VlJYOHDOOxhQtKmGxDseQ8atDeXDBuBBOmzWXG7EdKHaegWO5lDDljyAhx5IwhIyhnlmLICMqZpRgyQjw5pXU0SVJx1bn7m6n3r5nZcOA04PotPHdWv+1Yl5cxJo8ADcAg4B8AZtaf0HN9OjDdzLZz9/qk/VDgr+7+binCttai6moAevXus8H2nj17UbNkMWvXrqVjx44lSLahWHI+88Ii+o+azIraei4+a2Sp4xQUy72MIWcMGSGOnDFkBOXMUgwZQTmzFENGiCdn0ZRdn2e2VKC2vfr0GzObCWwPdAEOA36U7Drd3Xum2p0O3OzuFckxJyXbG4F+7l5tZscThuzuAywF5gCT3X3llgQ2s0OBy4FPA43An4AL3H1Jsn8+8HJy3b2B8e5+i5mNBi4i9B6/BdwIfM/dG82sA/Bt4CxCj+3LwHXufsum5nL3WjP7C3A4Yeg0wNHA88Bs4CfAMOAPyb6hwC9Tn2sf4IfAEKCOUPBe4O6LU5epMrNZwOeBFcCPyWCI9uaoq60NQbpUbbC9qqqKdevWUV9fT9euXdsqTpNiybn0nRWljtCiWO5lDDljyAhx5IwhIyhnlmLICMqZpRgyQjw5i6Vcnx3Niob4tiEzOxgYA9yct+vzwALgIOD2TTjVeYTi88+E4m6JmY0E7gFuIRSKZxCKtblbmHkgMB94ldBTOQroDSwws26ppuMIBeihwG/N7EvA3YRCcT/gW8CEJDvAVcA5yft9gO8DPzCzCZsZ8cEkV87RwB/dvQ54nGSYr5l9gjAU+E/J+92AR4HXgIOT4zoAfzGzHVPn+xzwHuF7823CEO0LNzPjFsk9J57/j1Fue4cy+UcqlpwxiOVexpAzhowQR84YMoJyZimGjKCcWYohI8STU1pHPajFdaGZnZ/8eRugEniKULSlvQ9cmeuVM8t/pHJD7r7CzFYBa3LDc5PC7hZ3n5E0e8XMxgFPmtkB7v5cE6fb1cxqC2zfzd1XAOOBF4GzUvm+SChYxxJ6KQFecPeZuYPNbDzwS3f/frLpJTOrAjqaWVdCYfo1d7832f+qme0CfNfMvufu65q9CR95ELg0KUA/IPSGfi/Zdz+hcIbQe/oBoagHOBtY6u7fSGUeQ+jpHUt4fhhCb+x5yWf/h5ntTSi2c5+r6Lp2C78HqKurY8eddlq/feXKlXTo0IHtunRpqyjNiiVnDGK5lzHkjCEjxJEzhoygnFmKISMoZ5ZiyAjx5CwW9aDKlrgZOCB57U/opVsNPG1m3VPtXslgyOiBwBlmVpt7AfOSff2bOe6tVMb064Nk/37AwnQ+d19KGJK7X+o8L+Wdd1/gifQGd78zKWL7A9sCd+TlnQJ0Bz6ZH9LMJqTbmtkNya6/JFkHEYbzfgg8luz7E7CnmfUkFKjz3L0h2Xcg0D/v+u8Rhlun79fjed+bvwCfSGZRbhO9+4TnK/KnTa+pWULfvv3K5h+pWHLGIJZ7GUPOGDJCHDljyAjKmaUYMoJyZimGjBBPzmJp78vMqEAtrmXu/nLyetHd7wdOBPomX3PynxEtVKxWtnCtDoTnV/MLzT2B3zVz3NpUxvSrpR7MDoRiOyf/M6xp4VgIw53TWfdN8r5T4Jgb8tpOAnD3DwnPjh5KmL13nrvnrv0s8DahOB1M6FFNZ3iUje+XAZek2q3Ny5F74n41baRPn7706LEL8x76aPLhhoYGFjw6n4GHHNpWMVoUS84YxHIvY8gZQ0aII2cMGUE5sxRDRlDOLMWQEeLJKa2jIb5tL1ecNTe12Bqgm5lVpHrv8tckzS9i/w6Yu7+c22BmnyYUW+fzUY/o5vobMDidJXl+c3c+GgZbyIuEZzvXM7OpwH8AXyLMvtvb3eem9p9GGKJ7av7J3P09Qg9nIQ8SnhXtDtyUOqbRzB4EhgOfInn+NPF3wkRTNe6+Krl+FXBXco77knYH5l3rcGCxu7f2fm62iooKxp1+BlddcTnb77ADBxw4gNl3zWL5smWMPfmUtorRolhyxiCWexlDzhgyQhw5Y8gIypmlGDKCcmYphowQT85iKdeez6yoQC2uKjPrkfy5AugJXAnUAr9q5rjHCUNNv2tmdxGGr56c1+YDYDcz60dY8/MqYI6ZXQb8jDB50k2EmWert+AzXAMsBG40s+uAHZJtbwA/b+a4q4C5ZvYk8FtCoXc+8J3kGdoZwBQzW56c/1DCDLkzNuP505wHCfe1Mxv2kpK8/wlQnS7ek21nAXcn92xtco5BbLhO7aFm9gPgtmTfOcB/bWa+LTb6xJNYtXo1d915B7PumInt1Z8ZN91Kz1692jpKs2LJGYNY7mUMOWPICHHkjCEjKGeWYsgIypmlGDJCPDmLon3Xp1TkZruSbJlZNWE9zpx1wDLCcNQr3f2ZpN1MYA93Pzzv+AmEQql7csxs4HZ3r0j2DyAUuT2AYe7+RDJ50QRCb+FyQi/ghU2t+2lml5K3nE0T7YYBUwkz2a4kLNvyHXd/Pdk/n9AT+bW8404hzHi7O6GInu7u05J9HQlL0JwG7Aa8TpjB+IpWFKiY2evASnffM297D8KSOze6+9l5+/YnTKg0mPDs6l+Sz/Vc6nO9RPgejALeBX7k7tduaq5VHxYcri2t0P3gc1tuVGLLnppe6ggiIiKSgc6dyrcM3PHrd2f2/8t//fTEsvucKlBFikgFanZUoIqIiEhbKecCdadTZmf2/8t3Z3617D6nhviKiIiIiIhEolTPoJpZB2AycDphhOFC4Jy8x+jS7XcBrgU+k2x6GPiWu9c0dx3N4isiIiIiIiItmQScDZwBHEJ4RO5+M+vcRPtfAr2BEcBngV6EuWmapQJVREREREQkEqVYB9XMtgXGA5e6++/d/W/AVwnz4Xy5QPudgMOAq9z9r+7+LGES1QPN7BPNXUsFqoiIiIiISCwqMnxtugOArsC83AZ3fx/4K2GZyHx1yevrZra9mXUFxgD/BP7V3IVUoIqIiIiIiESiFD2ohFU3APKfH11KGLq7AXevB04BhhJWF1lBWDljlLuvbe5CmiRJRKIQwwy5Mcw0DHHcSxERESk+M/sY8LECu5a7+/LU+y7J19V57VYDGz2DamYVwADCMo5XEerOqcBvzOwwd1/RVCb1oIqIiIiIiEQi4x7U84HXCrzOz7tsffJ127zt2wK1BWKOBr4BnOTuj7n7I8DxhN7WM5r7fOpBFRERERERiUTGy8xMA2YW2L487/2S5OuugKe27wq8UOD4w4GX0j2l7r7MzBzYs7lAKlBFRERERES2Qskw3vxitJDngfeBYSQFqpltTxjG+5MC7WuAPcysi7uvTNpXAf8GzG7uQipQRUREREREIpFxD+omcffVZjYduNLM3iQMA/4e8Dowx8w6AjsDK5IJkn4KXADMNrOJhDmDLwfWALc1dy09gyoiIiIiIhKL0iwzAzAJuBm4CXg8OcPR7r6G8GzpG4RnT3H3NwjDfAEeAh4E1gKD3H1ZcxdRgSoSiTm/uIfjjhnBwAH7MXbMaJ5/7tlSRyoohpwxZEwbNXRf3l54daljNCmG+xlDRogjZwwZQTmzFENGUM4sxZAR4snZXrj7Wne/yN0/6e5d3f0Yd3812Vft7hXuPjPV/h/ufry775y8Pp9r3xwVqCIRuPc3c5k6ZTKjjjuea6ZdT7du3Tj7zNOoqVnS8sFtKIacMWRMO2T/ftw29eSSDOfZFDHczxgyQhw5Y8gIypmlGDKCcmYphowQT85iKNE6qG2morGxsdQZ2iUzqwb6pDatARYDtwLfd/ctuvFmthNwgrvfugXnuBSY3MTuV9x9j9aeuy0k6zY9Txj7Pji96K+Z7Qw8Czzg7qcm2/YELgWOBD4OvAX8Cbjc3atTx24PTAS+CPQkTJ39BPA9d1+wORlXfcgW/4A1NjYycsSRDBo8mImTLgOgoaGBE449miFDh3PRhIlbeolMxJCz2BmzXAd1m8pOnDtmGJPOGUVd/Rq2qezEzoPGZ3LurNZB1fc8OzHkjCEjKGeWYsgIypmlGDJC2+Ts3KkVA2DbSM9z5mZWwNX85HNl9znVg1pc04BdktdehKJnIpDF/2KvBcZmcJ43+Chj+nVIBucuqmTWsa8B/0G4rwCYWQdgFmGmsW8k2z4JPEb4O38cYXrrscnXx5OCP+deQhH7n4ABnyEUwQ+b2dDifqqNLV68iKVLX2fY8CPWb6usrGTwkGE8tnCz6uWiiiFnDBlzjhq0NxeMG8GEaXOZMfuRUscpKIb7GUNGiCNnDBlBObMUQ0ZQzizFkBHiySmto1l8i6vO3d9MvX/NzIYDpwHXb+G5s/ptx7q8jFFx9wVm9j1gopnd7+5PEIrVwcDBuWmtgS8D2wFfS/W0LjKzzxF6Uk8ErjezTwFDgP9w9yeTdtXAmWZ2EPDfQJtWC4uqqwHo1bvPBtt79uxFzZLFrF27lo4dO7ZlpIJiyBlDxpxnXlhE/1GTWVFbz8VnjSx1nIJiuJ8xZIQ4csaQEZQzSzFkBOXMUgwZIZ6cxVKuQ3OzogK17dWn35jZTGB7oAtwGPCjZNfp7t4z1e504GZ3r0iOOSnZ3gj0c/dqMzueMGR3H2ApMAeYnCrSWsXMDiVMC/1poJEwLPYCd1+S7J8PvJxcd29gvLvfYmajgYsIvcdvATcShsk2Jr2c3wbOIvTYvgxc5+63tCLiZEIv551mdjZhhrEz3T29aPBaoAoYTphFDAB3fy8pSt9OtQMYaWZPu/u61Dk+B6Tft4m62loAqrpUbbC9qqqKdevWUV9fT9euXds61kZiyBlDxpyl76xouVGJxXA/Y8gIceSMISMoZ5ZiyAjKmaUYMkI8OYumfdenKlDbkpkdDIwBpuTt+jyh1++/CM+qntrCqc4DugK7Al8A3jGzkcA9wDcJBWRfwhDj/YERW5B5IDCfsJbRecAOwDXAAjPb190/SJqOS15PAu+a2ZeAu4HvAr8C9k3OUZ/kugr4KmG48wuE4vzHZvYJd79yczK6+4dmdhLhmdM/AHe7e/76SrOB8cADZvY3wnTXjwLz3N1T53rRzH5FKHpPN7P7gQXAQ7mCvK3lnhPP/21ZbnuHMvktWgw5Y8gYkxjuZwwZIY6cMWQE5cxSDBlBObMUQ0aIJ6e0jp5BLa4Lzaw2ea0hFG+LCMVS2vvAle7+krsvaumk7r4CWAWscfc3k0Zfy30AACAASURBVCGrE4Bb3H2Gu7/i7g8RCsbPmtkBzZxu11TG9GuHZP944EXgLHd/wd0fJ0we1IMNn4F9wd1nuvv/ufvbyXG/dPfvJ5/rV8A5wHIz60oodse7+73u/qq7zyIUrRckvaub6xXChEmdSPWQpu7ZMkIP8BTC3/tvAr8G3jKzq80s/cuarwBnJuccC9wOLDaz3ybPsraprt26AVBXV7fB9pUrV9KhQwe269KlrSMVFEPOGDLGJIb7GUNGiCNnDBlBObMUQ0ZQzizFkBHiyVks7X0WXxWoxXUzcEDy2h84GlgNPG1m3VPtXtnSWX2BA4Ez0kUmMC/Z17+Z495KZUy/cj2j+wEL0/ncfSlhSO5+qfO8lHfefQkz367n7ncmayP1B7YF7sjLOwXoDmxUBJrZhLwC+oa8JhcCBxOeD73OzPrmn8Pdl7v7ZHffN7nGV4GHCcX0lFS7te5+s7sPTfIcBdxA+P79Kv+8xda7T3i+In/a9JqaJfTt269s/nGJIWcMGWMSw/2MISPEkTOGjKCcWYohIyhnlmLICPHkLBYVqLIllrn7y8nrRXe/nzAZT9/ka07+M6KFitXKFq7VgfD8an6huSfwu2aOW5vKmH619KxlB0KxnZP/Gda0cCyE4c7prPsmed8pcMwNeW0n5XYkz8hOBS4BvkQYRvwzM+uYavMdM1t/z939bXf/ubuPBH5DmNkXM/u8mU1Otatz9z+5+9nAd4DDzGzHZj5b5vr06UuPHrsw76GPOoYbGhpY8Oh8Bh5yaFtGaVYMOWPIGJMY7mcMGSGOnDFkBOXMUgwZQTmzFENGiCentI6eQW17ueKsuanF1gDdzKwi1XOZvyZpfhH7d8Dc/eXcBjP7NKFoO5+PekQ319+AweksZrYbsDvhWdKmvEjo0VzPzKYSloT5EtAA9Hb3uan9pxFm0N3oGVx3fw94L3+7mX2cMGT6EeCHyQRMpxKeRb2EsO4pwEDgFDOb4+75xfMyPpokqSdwsZnNcvdX8tq9Ryh+W3svW6WiooJxp5/BVVdczvY77MABBw5g9l2zWL5sGWNPPqUtozQrhpwxZIxJDPczhowQR84YMoJyZimGjKCcWYohI8STs1jKteczKypQi6vKzHokf64gFD9XArU0P1T0ccLMvt81s7uAQcDJeW0+AHYzs37AEsLzm3PM7DLgZ4SZcW8CVhCWSWmta4CFwI1mdh0fTZL0BvDzZo67CphrZk8CvyUMQT4f+I67rzCzGcAUM1uenP9Q4MfAjE3ovU27nTAD8thcAe3ufzSz6YSlZx5w98cIhepjwENmdhVhYqZPEobtngjk1vG4jfD86cNJT+oCwvI0A4HvEWYhbq53uChGn3gSq1av5q4772DWHTOxvfoz46Zb6dmrV1tHaVYMOWPIGJMY7mcMGSGOnDFkBOXMUgwZQTmzFENGiCdnMbT3ArUiN9uVZMvMqoH04kzrCD11jxAmRHomaTcT2MPdD887fgJhhtvuyTGzgdvdvSLZP4BQ5PYAhrn7E2b2RcJkSZ8ClgP3ARe6+7tNZLyUvOVsmmg3jDCE9iDCUN4/EArN15P984Ead/9a3nGnEJ4N3Z1QRE9392nJvo6EJWhOA3YDXicUm1dsaoFqZt8kDGs+zt1/l7dvO+BpwtIy+ydFsRF6VYcCn0g+y5+Taz6WOrY7Yfbh44HehN7q/yUUzzM3JVvOqg8LDteWdqr7weeWOsImWfbU9FJHEBERKWudO5XvYi79zr8vs/9fvjZtVNl9ThWoIkWkAnXrogJVRESkfSjrAvWbGRao15ZfgaohviIiIiIiIpFo70N8NYuviIiIiIiIlAX1oIqIiIiIiESivfegqkAVERERERGJRDuvTzXEV0RERERERMqDelBFREREREQioSG+IiKySWJZvkXL4YiIiMSrndenGuIrIiIiIiIi5UE9qCIiIiIiIpHQEF8REREREREpC+28PtUQXxERERERESkPKlBFIjHnF/dw3DEjGDhgP8aOGc3zzz1b6kgFxZAzhowQT86cUUP35e2FV5c6RkGx3MsYcsaQEZQzSzFkBOXMUgwZIZ6cWevQoSKzVzlSgSoSgXt/M5epUyYz6rjjuWba9XTr1o2zzzyNmpolpY62gRhyxpAR4smZc8j+/bht6sll+VxMLPcyhpwxZATlzFIMGUE5sxRDRognZzFUVGT3KkcVjY2Npc4gRWJm1UCf1KYG4B3gT8Al7l6TtJsPDE21+xB4D1gATHL3/ytw7hHAt4CBQGegGvg5cK27v5/X9tPAJcDhQFfgdeC3wBXu/k4z+fsCrwGfdfcHC+yvAW5x90tT27oDFwJfSD77cuDJJNe8vOOrgVnuPjG1rQvwTWA0sDtQCzwNXOnujzWVtSmrPmSLf8AaGxsZOeJIBg0ezMRJlwHQ0NDACccezZChw7lowsQWztA2YsgZQ0Yofs4sl5nZprIT544ZxqRzRlFXv4ZtKjux86DxmZw7i2Vm9D3PTgwZQTmzFENGUM4sxZAR2iZn506UafkG+1z8p8wKuBeuGFF2n1M9qO3fNGCX5PXvwKnAvsATZtYz1W5Oqt0ewJeA7YE/m9n+6ROa2cXA74DngCOATwGTga8AT5rZbqm2+wCPEgrYIwADvgF8BphnZttk9UHNrBehmDwG+G5yrZHAK8ADZvbtFo7fKTn+q8AUYL/kXG8B883sc1ll3RyLFy9i6dLXGTb8iPXbKisrGTxkGI8tXFCKSAXFkDOGjBBPToCjBu3NBeNGMGHaXGbMfqTUcTYSy72MIWcMGUE5sxRDRlDOLMWQEeLJWSwVFRWZvcqRZvFt/+rc/c3U+2ozewr4X+AqYGyyfVVeu0Vmdiyh93E6MBjAzIYCU4HR7n5Pqv2rZnY/ocC7FTg62X4qUO3u5+VlqAH+BhwF3JvB5wT4KaHH9HB3r899DuCvZvZPYLqZPebujzdx/E8IvcEHuvuK1PZxZvbx5Pjfu/uajPJukkXV1QD06t1ng+09e/aiZsli1q5dS8eOHdsyUkEx5IwhI8STE+CZFxbRf9RkVtTWc/FZI0sdZyOx3MsYcsaQEZQzSzFkBOXMUgwZIZ6cxVKmdWVm1IO6FXL3ZcDtwBfNbNtm2q0hFKeHm1nvZPN/A3/LK05z7d8n9DweZWZ7JZvXAr3ye2Hd/e+Entd5ZMDM9gWGA1NTxWnaDcCrSf5Cx3+SMCz4urziNOc84DjC8Oc2VVdbC0BVl6oNtldVVbFu3Trq6wt93LYXQ84YMkI8OQGWvrOCFbXlkydfLPcyhpwxZATlzFIMGUE5sxRDRognp7SOelC3Xs8D2wF7bkI7CMNdFwOHAb9upv1DyddBwD+AG4FxwLNm9iTwMOHZ1vnu/kLrohd0WPK14HOi7t5oZg8ThvwWcgDQESjYu+ruiwi9sW0u95x4/jCM3PYOZfJrtBhyxpAR4skZg1juZQw5Y8gIypmlGDKCcmYphowQT85iKdehuVlRD+rWa3nydYfNbLcj8K9m2r+bfN0ZwN1fBfYHrgV2Ijwb+nvgLTO7cBOz3mtmtfkvYNdUmx2Try1l27mJfR9Pvi7bxExtpmu3bgDU1dVtsH3lypV06NCB7bp0KUWsjcSQM4aMEE/OGMRyL2PIGUNGUM4sxZARlDNLMWSEeHIWS3t/BlUF6tYrV3Aub7bVxu3+RfNFbffka65Qxd2Xuvt4d9+DMLPuqcDfge+b2ZkABQrQ3qlznkXo4cx/vZVqkytMW8r2bhP7crMJ79jE/pLp3Sc8X5E/bXpNzRL69u1XNv+4xJAzhowQT84YxHIvY8gZQ0ZQzizFkBGUM0sxZIR4ckrrqEDdeh0E1AH/3IR2ALmVjxcAQ5ppPyz5+hiAmf0gWZIGAHdf7O4zk3M8S3iuEzYuPpemzrnU3V/OfxGeb83JTdnWXLahNDEEGHiKsAzPoYV2mtlAM/u9me3RzPmLok+fvvTosQvzHvpopZ2GhgYWPDqfgYcUjFsSMeSMISPEkzMGsdzLGHLGkBGUM0sxZATlzFIMGSGenMWS1Rqo5VrH6xnUrZCZbQ98HZjt7g1m1lS7TsDZwEPunisYpwELzGysu9+Z174rYbmZB9z9xWTzkcAAM3vA3dev2eTua81sBfB28v7lAtff5M/k7v9nZn8EpiTX2mDMh5mdCvQn9MYWOn6Fmd0DnGdmt7r7B3lNLgIGEJ7DbVMVFRWMO/0MrrricrbfYQcOOHAAs++axfJlyxh78iltHadJMeSMISPEkzMGsdzLGHLGkBGUM0sxZATlzFIMGSGenMXS3nuIVaC2f1Vm1iP587bAPsDlwDrgklS7zql2lcDuwETg34CTco3c/fFkPdFbkzVO7yYM/z2QMIPvNoQhvDnfITxz+mszu44wk25PwpqpBwHnZvdROQ14EHjczCYTemh3AMYA44EJ7r6wmeMvABYCj5nZpcnxPYDzCT29J7T1EjM5o088iVWrV3PXnXcw646Z2F79mXHTrfTs1asUcZoUQ84YMkI8OWMQy72MIWcMGUE5sxRDRlDOLMWQEeLJKZuvIjfblbQ/ZlZNeOYzZyVQA9wHXJ3rFTWz+YThrzmrCUNsHwJ+6O4bDQNO1kMdD/wH0A2oBn4BXJMsN5NuO5DQA3kYYTKiFYTlZS5rbiZfM+sLvAZ81t0fLLC/BrjF3S9NbesGfItQAPcDaoEngGnu/nDe8dXALHefmNq2E6GoPoFQSK8gDP+d6u5PNpW1Kas+RD9gUna6H5zl74WKZ9lT00sdQUREtlKdO1G23ZQDpjyc2f8v/zrpiLL7nCpQRYpIBaqUIxWoIiIizSvnAvWgy+dl9v/LZy4ZXnafU5MkiYiIiIiISFnQM6giIiIiIiKRaOdzJKlAFRERERERiUV7n8VXQ3xFRERERESkLKgHVUREREREJBLtvANVBaqIiIiIiEgs2vsQXxWoIiJbmViWb4lhOZxY7qWIiLQf7bw+1TOoIiIiIiIiUh7UgyoiIiIiIhIJDfEVERERERGRstDO61MN8RUREREREZHyoB5UERERERGRSLT3Ib7qQRWJxJxf3MNxx4xg4ID9GDtmNM8/92ypIxUUQ84YMoJyFsOoofvy9sKrSx2jSTHcyxgygnJmKYaMoJxZiiEjxJMzaxUV2b3KkQpUkQjc+5u5TJ0ymVHHHc81066nW7dunH3madTULCl1tA3EkDOGjKCcxXDI/v24berJZfub5xjuZQwZQTmzFENGUM4sxZAR4skpm6+isbGx1BnaHTOrBvqkNjUA7wB/Ai5x95qk3XxgaKrdh8B7wAJgkrv/X4FzjwC+BQwEOgPVwM+Ba939/by2nwYuAQ4HugKvA78FrnD3d5rJPwyYB+zp7i+38Fm/CpwNHAB0BF4C7gSmu/uaVLtLgdPdvWfe8ccC3wA+DWwHvALcCvzE3T9sTUYz60S456e6+8xU27T6JOtM4MfuvjY5ti/wWl7btYTv38PAd3Lfv02x6kO2+AessbGRkSOOZNDgwUycdBkADQ0NnHDs0QwZOpyLJkzc0ktkIoacMWQE5czJah3UbSo7ce6YYUw6ZxR19WvYprITOw8an8m5s1oHNYbveQwZQTmzFENGUM4sxZAR2iZn506U528zgcHXLMysgFsw/vCy+5zqQS2eacAuyevfgVOBfYEnzCxdpM1JtdsD+BKwPfBnM9s/fUIzuxj4HfAccATwKWAy8BXgSTPbLdV2H+BRQgF7BGCEQvAzwDwz22ZLP6CZ3QTcAvwBOBQ4EPgx8E3gETPr2sLxPwDuARYCRxKK3P8BLgfu3tJ8BRxKuM+7AgOS7FMIBXG+r/DR96V38v5g4Pdm1qY/yIsXL2Lp0tcZNvyI9dsqKysZPGQYjy1c0JZRmhVDzhgygnJm7ahBe3PBuBFMmDaXGbMfKXWcgmK4lzFkBOXMUgwZQTmzFENGiCdnsVRUVGT2KkeaJKl46tz9zdT7ajN7Cvhf4CpgbLJ9VV67RUmv4pPAdGAwgJkNBaYCo939nlT7V83sfuBpQqF1dLL9VKDa3c/Ly1AD/A04Cri3tR/OzE4GxgFD3P3x1K6XzOxPyTWuBv6zieNHAt8Gjnf3dI6Xzext4NdmNsrd72ttxgLeTd3rN4B/JNeabWZ3uvtDqbbL8r4vS5Ne4J8B+wHPZ5irWYuqqwHo1bvPBtt79uxFzZLFrF27lo4dO7ZVnCbFkDOGjKCcWXvmhUX0HzWZFbX1XHzWyFLHKSiGexlDRlDOLMWQEZQzSzFkhHhySuuoB7UNufsy4Hbgi2a2bTPt1hCK08PNrHey+b+Bv+UVp7n27xN6Ao8ys72SzWuBXvm9sO7+d0LPa/6Q1811HnBfXnGau8brwLXAKWa2QxPHnw08l1ec5vwG+CyhB7jY7gGWAGM2oW1uyPGq4sXZWF1tLQBVXao22F5VVcW6deuor69vyzhNiiFnDBlBObO29J0VrKgtjyxNieFexpARlDNLMWQE5cxSDBkhnpzF0t4nSVIPatt7nvCs5Z6b0A5Cb91i4DDg1820z/X+DQL+AdxI6OF81syeJDw/uQCY7+4vtC56YGbbEYbj/ryFPJcTni19qMD+TwO/KnSguzcCD25Jxk3l7o1m9ndg/6bamFkHQlE/kTC8+qW2yJaTe048fxhGbnuHMvnXJYacMWQE5dwaxXAvY8gIypmlGDKCcmYphowQT85iKdehuVlRD2rbW558bapnsal2OwL/aqb9u8nXnQHc/VVC0XUtsBPwXeD3wFtmduFmZs7XnfB3Z5PzFPBxYNkW5sjKcjb+ftxrZrVmVgusBv5K+Exfdvd1bRmua7duANTV1W2wfeXKlXTo0IHtunRpyzhNiiFnDBlBObdGMdzLGDKCcmYphoygnFmKISPEk1NaRwVq28sVQsubbbVxu3/RfFHbPfmaKwxx96XuPt7d9yDMKnwq8Hfg+2Z2JkCuCEu9em905o29BzRubp487xCK7maZWe/8jMmuhuRrob/DHfLatGQHNv5+nEXoJT6AMHlVN3c/oqVZjYuhd5/wfEX+tOk1NUvo27df2fwWLYacMWQE5dwaxXAvY8gIypmlGDKCcmYphowQT85iae9DfFWgtr2DgDrgn5vQDiC34vACYEgz7YclXx+DMENusiQNAO6+2N1nJud4Fjgu2XVA3mtpSx/A3VcRJmVqKc9q4Jkm9j9OmFW3IDP7tZmdmuTJzwihSAb4WIHDd8xr06RkRt4BhB7StKXu/nLyWuTuJXuYoU+fvvTosQvzHvpo1HNDQwMLHp3PwEOavIVtLoacMWQE5dwaxXAvY8gIypmlGDKCcmYphowQT85i0Sy+khkz2x74OjDb3RvMrKl2nQiTCD3k7rmCcRqwwMzGuvudee27EpabecDdX0w2HwkMMLMHkmc6AXD3tWa2Ang7eb9Rj2BTufJcA9xlZsPcfX7e8bsQ1mq9I5kYqpCbgAfM7Lj8iZLM7ATgc8DMZC3UQr2W/wRWEIrkJ/P2DSH08DZVHKd9ibCUzJ0tNSyViooKxp1+BlddcTnb77ADBxw4gNl3zWL5smWMPfmUUsdbL4acMWQE5dwaxXAvY8gIypmlGDKCcmYphowQT05pHRWoxVNlZj2SP28L7EOYNGgdcEmqXedUu0pgd8JkPP8GnJRr5O6Pm9m3gVuTNU7vJgxLPZAwg+82hCG8Od8hPHP6azO7DngV6ElYz/Mg4NxN+AyDzWyPvG3V7v4Pd/+5mR0G3GdmlxNm3l1FmKRpKrCIUKQW5O4Pmtn/APeY2RTgt4SZh48BLiMs5/LbZo5fm6yjeqmZ1QP3E+7foYRlfP7H3d/OO2ynZIhwBaHn9RjgUuA2d1/Y8u0ondEnnsSq1au56847mHXHTGyv/sy46VZ69upV6mgbiCFnDBlBObdGMdzLGDKCcmYphoygnFmKISPEk7MYyrTjMzMVudmuJDtmVk145jNnJVAD3AdcnesVNbP5wNBUu9WEIa0PAT90942GASfroY4H/gPoBlQDvwCuSZabSbcdCFxEmAH444Qex3nAZc3N5Gtmw2h6GZrr3P38VNvPEYrdAwmF+D8JxeX1yXI5uXaXAqe7e8+8a51MeN6zP6HAfAm4Gbg56T1tlpmdAZwJGNAReIWwHuyPcz3HTXyed5Nr3Q7cmpv4yMz6Aq8Bn3X3LZ5JeNWH6AdMpJW6H7wpv0crrWVPTS91BBERKYLOnSjbMvCz05/I7P+XD5x7SNl9ThWoIkWkAlWk9VSgiohIqahALR0N8RUREREREYlEqYb4mlkHwrw3pxNW7FgInNPUKhdmVkl4FPFkwuN1TwPnuftzzV1Hs/iKiIiIiIhEooSz+E4iTOR6BnAI8CFwv5l1bqL9DEIxeyZhDpx3gD+aWaFVONZTgSoiIiIiIiJNMrNtCfPgXOruv3f3vwFfBXoAXy7Qvh9wGmEOmvvc/R/J+1XAwOaupSG+IiIiIiIikehQmiG+BwBdSU086u7vm9lfCUs85i/ZeBTwAfC7VPsVQN+WLqQCVUREREREJBKtGJqbhd2SrzV525cChdb2+XfCyhijzGwi0Bv4KzDe3V9s7kIqUEVEpCzFMENuDDMNQxz3UkRE2l7yPGihZ0KXu/vy1PsuydfVee1WA4WeQd2e0Ft6BfBt4D1gArDAzPZx97eayqRnUEVERERERCJRUZHdCzif0NOZ/zo/77L1yddt87ZvC9QWiLmGUKSOcfc/uvuTwIlABTCuuc+nHlQREREREZFIVGS7ROs0YGaB7cvz3i9Jvu4KeGr7rsALBY6vARrT+9y93sxeAfo1F0gFqoiIiIiIyFYoGcabX4wW8jzwPjCMpEA1s+2BAcBPCrR/lNBbehDwVNJ+O2B34JfNXUgFqoiIiIiISCRKMYuvu682s+nAlWb2JmEY8PeA14E5ZtYR2BlY4e717r7QzB4E7jCzs4B3gcuAdRTusV1Pz6CKiIiIiIhEoqKiIrPXZpoE3AzcBDxO6CE92t3XEGbyfQMYnWr/eeBhYA7wNNAdGO7ubzd3ERWoIpGY84t7OO6YEQwcsB9jx4zm+eeeLXWkgmLIGUNGUM4sxZAxbdTQfXl74dWljlFQLPdSObMTQ0ZQzizFkBHiydleuPtad7/I3T/p7l3d/Rh3fzXZV+3uFe4+M9W+1t2/4e47u3sXd/+Mu/9vS9dRgSoSgXt/M5epUyYz6rjjuWba9XTr1o2zzzyNmpolLR/chmLIGUNGUM4sxZAx7ZD9+3Hb1JNLtc5ds2K5l8qZnRgygnJmKYaMEE/OYsh4Ft+yU9HY2NhmFzOzaqBPalMD8A7wJ+ASd69JtZ0PDE21/ZCwfs4CYJK7/99mXrsCOAc4DdgLWAv8L3Czu9+2mR8l/9yfAvq4+33J+52AE9z91i05b+r8pwC3A5Xu/mFG55wJ7OHuh7fQrjtwIfAFwvduOfAkcK27z8trWw3McveJqW1dgG8Suvt3J0xD/TRwpbs/1tqMZnY64XtXkbo/zTl1E9o84u7DCvw9XQd8kOSe5O6Pt3Ce9VZ9yBb/gDU2NjJyxJEMGjyYiZMuA6ChoYETjj2aIUOHc9GEiS2coW3EkDOGjKCcWSp2xizXQd2mshPnjhnGpHNGUVe/hm0qO7HzoPGZnDuLdVBj+H6DcmYphoygnFmKISO0Tc7OnbKdKjdLX7j1mcwKuF+ddlDZfc5S9KBOA3ZJXv9OKBz2BZ4ws555beek2u4BfImwns6fzWz/zbzuZcClwDXAfsBA4OfADWZ2cas+yUf+ABycen8tMHYLz1lyZtaLUJQdA3wXMGAk8ArwgJl9u4Xjd0qO/yowhXDfjwHeAuab2ecyivpzPvp7sgvwZzb8u7NLgTa5tZ16prZ9IXXO9N/TnsDhwErC5+6dUe5NsnjxIpYufZ1hw49Yv62yspLBQ4bx2MIFbRmlWTHkjCEjKGeWYsiYc9Sgvblg3AgmTJvLjNmPlDrORmK5l8qZnRgygnJmKYaMEE9OaZ1SzOJb5+5vpt5Xm9lThN7Mq9iwsFuV13aRmR1L6MGbDgzejOueA/zA3X+W2vZiUoSNB67YnA+RJ/83D2X3m4hW+imhx/Rwd88tzrsI+KuZ/ROYbmaPNdOj+BOgM3Cgu69IbR9nZh9Pjv998mB1qyXZcvkwszVs/HeHvDa5PG810Sud//f0DTP7T8JMZZ8HrtuSzJtjUXU1AL1699lge8+evahZspi1a9fSsWPHtorTpBhyxpARlDNLMWTMeeaFRfQfNZkVtfVcfNbIUsfZSCz3UjmzE0NGUM4sxZAR4slZLOU6NDcrZbHMjLsvM7PbgW+Z2enuvrqZtmuSKY5vNrPe7r44mdb4v4CzCAu/LiXMLvUDd1+XHLoWGG5m/+PudalTXgHc2NT1zGxbYCqh93Y3oA54CDjH3d9OhoPuBkxOhprOB05Kjm1M8rzR3DmStjsBPwSOBbYFngC+6e4bLXybFOlzgIvd/Woz+wTwP8BwoAp4Fpjg7vOb+lwtMbN9k/N9IVWcpt0AfAv4b8IsXvnHf5LQIzk+rzjNOQ/4OGHodixyWVe15UXramsBqOpStcH2qqoq1q1bR319PV27dm3LSAXFkDOGjKCcWYohY87Sdwr9U1k+YrmXypmdGDKCcmYphowQT85iKcc5CrJUFgVq4nlgO2BPQm9qS20hDBldTBi2eyqhWHqM0LN6HfAJQhEFoRC9jtAT9gDhWdZ57v484dnWpvwA+BzwdcJ6P/sRnmWcBJxLGNr7PHAX8H1gDdAV2JVQoL0D/Ki5c5hZJ+ABoDE55u0k7wNmtns6jJkdQ1jc9kJ3z/Xi3QhUEp7ZXQ1cDPzWzHZz9w+avZNNOyz5WvA5UXdvNLOHCUN+CzkA6EiB4jU5fhGhNzYK/8/emYdXVV2N+72BIBAizkIFQYsu0TpXikUGJxwQ/ar9pIqgImi17uDVdwAAIABJREFU1lqnWoogitr2c0DtJ9aRKg51RP1p64AooHWo87gUa4CIA34CSggQIL8/9rl4crlJbuDc3LvCennOc+/dZ5993rOT8GRl7722iPyA8HVcQpjS3Wyk14ln/meULi8pkv+kLHhacAT3TBILjlaw0pfumRwWHME9k8SCI9jxdNaNYgpQF0WvHZtSV0Q2JkzfvVBV/xaVz46mkF4hIuNVdbGqXici70d1DyJabygi7wAjVfWVeu71KvCQqqYXBM0RkScJ62ZR1QUishpYoqoLojaXASvSU0SjKcz1tgEcSAjodkknfxKRUcBFwBYxl4GE4PRsVb0xVr4dIaj/VFWXishvgLtYv9HJzaPX/2ugzteEDXmzsVn0unA9HAD2FZElWcrz/b17gYik16m2Joxqfwgcq6pz83zvOnQoLwegqqqKzbf4/tth6dKllJSU0K59++bUqRcLnhYcwT2TxIKjFaz0pXsmhwVHcM8kseAIdjzzRUuPv4tpm5l0YLqowVpr1+1JGD2ckVHn+ai8Z7pAVZ9R1aMJwddPCEmTOhNGKrcgO3cBbUTkTyLyUBTk/oIwOpgrjbWxKyHAXZOZWFUXquo5qhrPlf0AYZT504z2xxPWRf5fNDp8GvCuqlaLyFARWRI7ch39SwemDf3BYFNCkJqNBdHr5vWcX4OIjM5wjAffbxCC98xjfGPtric3x+7VE9hEVXuqarOOngJs2y2sr8hMm15ZOY/u3bcrmmkeFjwtOIJ7JokFRytY6Uv3TA4LjuCeSWLBEex45ouSVCqxoxgppgB1b8LazI9yrAsheKmP9LMtF5HdRGRStOUJqrpSVV9R1fGEUcmNqbulTZy/EjLAtgEeBY4D7snBsSltrICctiP5ZXTdzdHIMQCq+jBhSvFJhOD1N8C70fY3j1I3sBuZo3M6BVq/Bur0p54pwISR5xpg32wnRaSXiDwhIj0I61njjmNjVZep6uzMg+8D4HyxMHa/T+tZR9ssdOvWnU6dOjN92jNrympqapg54zl69c7avQXBgqcFR3DPJLHgaAUrfemeyWHBEdwzSSw4gh1PZ90oiim+UbB1InCvqtY0Urc1cDowTVXnR9M/awiB1L9jVdPrMT8h7Gn5S8J6yDszmkyvP/0qy702B0YBJ8Sz/4pIT+omyskMLmtjdXNp4wOgXEREVTU6X04INo+PtXs3Yf3jB4T1kCNFpB0h+/HfVPXvwN9FpC1hK5cjVfVywh6eTUJV3xeRfwKXiMjTGYmlEJGTCSOLp9Vz/WIRuQ/4jYjcmmUt7IXAXsDcKItvQ+uAN2hSqRQjRo7iissuZeOOHdljz7249+4pLFq4kGHDTyq03hoseFpwBPdMEguOVrDSl+6ZHBYcwT2TxIIj2PHMF8U57pkc9QaoIpI5ZbYhalW1vhHITMpEpFP0fiNgF+BSYDVhzWWctrG6pcAPgTHA9kSZclX1WxG5gZBF92tCELpf1NYkVf0WeEdEJhP2PN0WeISw5cguhNG6Z1U126ZJi6PjSBF5hbBlyq8JgdVrsXrfATuKyA9UdX70eRsR2Q6Yl0MbzxBGHO+I1o8uJiRJ+i56np+nbxSteT0buFNEHlDVf4pIL6CPiJxFyBh8GFBO2A+0ITYRkUOzlL8QBZSnRG4visg4woh1R0LQfC4hU/CsBto/D5gFvCAiF0fXdyLsQToYOGp9t5jZUBhy3FCWLV/O3XfewZQ7JiM79WTSTbfSpWvXQqvVwYKnBUdwzySx4GgFK33pnslhwRHcM0ksOIIdz3zQ0qcwp9LZrjIRkefIbdopAKq6f2N1oi1Z4hsWLQUqgceBK6PgLn7/eNC7nLB9zDTgf1T1o1jdVoQRuVGEqa4VhG1mrk5vMxPVOZ2wz+pOhEBxDmHK7J9UdWk9zgcTsgTvQBjlmw68RwiUO6nqdyIyIqqzGtiakKX3IUIwNoAQLDbWRjpL7KGEP4zMAM5R1Y+j7WtuB0rTe3aKyBOEtas/ImwtcxVwALAJoNEzxfd8zXyuyYRR62zsqapvRvXKCZmQjyUkY1pC2AJnoqo+m9FmBTBFVcfEyrYAfgccBXQhBN+vAhMaSEwVd+yhqvtlOTcSuFlV1/oJjb53KlX1hAbaPomMPm3oOdaVZStz/xlyHMcem+5zZqEVcmLhq38ptILjOI4p2rYu3oHK4+54M7HfL+8ZvkfRPWe9AarjOOuPB6iO07LxANVxHKdlUswB6tA7kwtQ7xpWfAFqIkmSomQ8juM4juM4juM4Th5JpVKJHcVITkmSokQ/VxCmq27E92tzSwjTSzemaduuOI7jOI7jOI7jOE4dch1BvRo4GfiQsBb0/wgJeFKE9ZWj8mLnOI7jOI7jOI7jrCGVSu4oRnINUA8FLlHVI4FJwDxVHUJINvQuIVmP4ziO4ziO4ziOk0da+hTfXAPUTQnbnUAISH8MEG1FcjUwKHk1x3Ecx3Ecx3EcZ0Mi1wB1AWH7EoCPga2jdakAnwHbJC3mOI7jOI7jOI7j1KUkldxRjOSUJImw9+hoEXlLVWeLyALCHppXA4OBr/Ml6DiO4zjFipXtW3w7HMdxnJZDsU7NTYpcR1AvAjYHJkefrwCuFJHFwK+B25JXcxzHcRzHcRzHcTYkchpBVdU5IrITINHna6NR1D7Ay6p6Rx4dHcdxHMdxHMdxHL7f77OlkusUX1R1GfBW7PPdwN35kHIcx3Ecx3Ecx3HWpqSFT/HNKUAVkbGN1VHVS9Zfx3Ecx3Ecx3Ecx6mPFh6f5rwG9eIGjnOBE5LVchwnkwfvv4/Bhw2k1167Mez4Ibz15huFVsqKBU8LjuCeSWLBEex4phnUf1e+mnVloTWyYqUvLXhacAT3TBILjmDH02kauQaopVmOzYGfA98Cp+TFznEcAB57ZCoTLhnHoMFHctXE6ykvL+f0U0+hsnJeodXqYMHTgiO4Z5JYcAQ7nml6774dt00YXpTZJK30pQVPC47gnkliwRHseOaDVCqV2FGMpGpra9erARE5HThJVX+SjNKGhYhUAN1iRTWEfWefAi5S1comtLURcB4wFNgeWAa8Dlyrqo/k2EZ/4ExgX2ArYCEwC/izqr7cBJcBwHRgB1WdXU+dWcBsVT0p13ZzuG8Fdfszk3bReupmYdlK1u8HDKitreXwgQfSp29fxowdD0BNTQ1HHXEo/frvz4Wjx6y3ZxJY8LTgCO6ZJBYcIf+eSW4z06a0NWceP4CxZwyiqnoFbUpbs2WfcxNpO4ltZvxrnhwWHME9k8SCIzSPZ9vWxZuL6LQH3lvv3y/T/PXnuxTdc+Y6gtoQHwO7JtDOhsxEoHN07AicTOjTl0SkSxPauRkYAYwGdgb2A14EHhaRoY1dLCLnAc8AnwHHAD8E/oswSj5LRAY2waWQxPuzztGcwWlSzJ07h/nzP2PA/gesKSstLaVvvwG8MGtmAc3qYsHTgiO4Z5JYcAQ7ngCH9NmZ80YMZPTEqUy69/lC66yFlb604GnBEdwzSSw4gh1PZ93IOYtvNkSkLfBL4PNkdDZYqlT1i9jnChF5FXiXsOfssMYaEJGNCWuBf6GqU2OnxohIT+Ac4K4Gru8F/BH4rapeHzs1D/hX9LX+I2Fkt9jJ7E/TzKmoAKDrtnUHhrt06UrlvLmsWrWKVq1aFcCsLhY8LTiCeyaJBUew4wnw2ntz6DloHIuXVPOH0w4vtM5aWOlLC54WHME9k8SCI9jxzBeexRcQkXmw1lTFVoR1qG2A3yTstcGjqgtF5HbgHBEZSRjt/j1h+u42wH+Aq1X1luiSWmA1cIiIPKyqNbHmzgDaNXLLM4EK4H/rOX8WsCr9QUTaNeJTh2j68R+j+hsBN5Axgh+NFl8FHBLd6xXgfFV9Nzo/mfB99wVwYvR+JnCGqs5v5Pni9/kNcDnQSVW/i5V/DNypqpeIyCbAn4GfRb5vAqNVdVau90mKqiVLAChrX1anvKysjNWrV1NdXU2HDh2aW2stLHhacAT3TBILjmDHE2D+gsWFVmgQK31pwdOCI7hnklhwBDue+aKFx6c5T/GdluV4ErgROChjxM1JjrcIgeUOwD2EZFTnEqb/3gzcICJnAUSB1rWEKb7zReQuEfmliOyoql+qakUj9xoAPKuqq7OdVNUFqvpNrKhBnyxcBxxHmL78U8Ia2X3TJ0WkDHie8D05AOhHCHpfEpEdY+0cS/jDSH/CyHI/4LJGni2TKYTg9uex++9HmNL8NxFJAf8g9PtgYB/C1OfpItKvifdab9LrxDMXsqfLi+WvaBY8LTiCeyaJBUew42kBK31pwdOCI7hnklhwBDuezrqR0whqY0lsRKS1qq5MxMiJsyh67QgcBRwTm757jYhsD4wWketVtVZVzxWRlwiB48+A42FNMqJTVPWjBu61FSE50xpE5AIgcw/c3Qgjig36ZLRTDpwEnKWqj0dlJwH7x6odB2wGHB8b/f1VlLTpDODsqGwJcFpU5wMRuQvIXBt7gYiczdpMVtUzVfX/ROQRYDhwe3TuRGCaqs4RkYOA3sBWqpruk0tE5CeEqdIzsrSdNzqUlwNQVVXF5ltssaZ86dKllJSU0K59++bUqRcLnhYcwT2TxIIj2PG0gJW+tOBpwRHcM0ksOIIdz3xRrNl3kyKnEVQR+Y+I7FnPuT6EKZdO8nSMXg+KXjMDo+eBraMDAFW9X1UPBTYljDJeCewJPCkibURktIgsiR03Rpf+HyFAjHMzsEd0nAaUEb5ndsvVJ0IIU8FfjXlWE6bNptkT2BhYGPcDdgJ6xur9J2P68uKo7fq848f4WJ1bgf4i0i2arnws3wer6e/1TzNcDs5waRa27RbWV2SmTa+snEf37tsVzX9SFjwtOIJ7JokFR7DjaQErfWnB04IjuGeSWHAEO575oiTBoxipdwRVRH5HCEgAugNnRWtRM+lNmC7pJM/eQBXwYT3n099Xy6ORxqNV9TcAqrqcEEDOEJEXgYcIU3FvBO6LtfFt9DqLMLV2Daq6kLDNTHp9aGOs8annfOb/FvFAswSYDQzKcl117H22tjPbXVjf1jYxniEkgDoB+ISwhvehmMtSQlCbSU2WsrzSrVt3OnXqzPRpz/DTPvsFiZoaZs54jr79BjS3Tr1Y8LTgCO6ZJBYcwY6nBaz0pQVPC47gnkliwRHseDrrRkNTfFsB6U2EaglTIDNZTZiGWhybIrUgoqy8JwL3Am9Hxf34PoiCMEI6P0qotDHhjwgPqGpmfu1vCF/D9DrSb1iba4GZIjJKVW/Ocn7b2PtcfOLXfkDYk/WnwGvR85UCuxMCRYB3CNOAv1XVr6I6KcJ60aeByVmc1hlVXR0loTqGEBjfE9uC5h2gPdBeVdPPiohcC8wH/pSkS2OkUilGjBzFFZddysYdO7LHnntx791TWLRwIcOGn9ScKg1iwdOCI7hnklhwBDueFrDSlxY8LTiCeyaJBUew45kvWvoIcb0BqqpeTsh0ioisBvqq6gvNJbaBUSYinaL3GwG7AJcS/gBwkap+Hq2ZvD76WrwHHAGMAs6PrnsceJaw5+l4vt8OZg9CEqHJqjq3PgFVfVFEziEkOvoxcCdhhHFbQuB4IiFp09equigHn3jbVdG61HEi8hnwPnAB0ClW7S7gQuDBaO3rN1GdY4CrG+vADOL9mck3qroien87cBFhGnH/WJ0ngdeBe6KkTxWE5E6/Jqy9bXaGHDeUZcuXc/eddzDljsnITj2ZdNOtdOnatRA69WLB04IjuGeSWHAEO54WsNKXFjwtOIJ7JokFR7DjmQ9KWnZ8Siqd7aohRKQbYeSoW3rqpIhsAfTMMlrnNAERqQDimzgtBSoJAeeV6e1TonWSEwjJhDYHFLhGVW+PtdWOkMTnWEKW3NbAx4RA7PpcElmJyD6EQKw/IYD8Dvg3IYC8J91GYz4iMgCYDuygqrNFpBUwjhDElhOyAG9FmI57UnRNd+B/CGtuSwkB8RhVnR6dnwz0UNX9Yr4TgBNUtXs9/ZnJYar6z9j1zxC2m/lRRj9sTthmZnDk+yFwmao+0Fgfxlm2cq3tmRzHcZqdTfc5s9AKObHw1b8UWsFxHAeAtq3XWkJWNJz9yIeJ/X458aidiu45cw1QtwAeAbZW1R5R2eHA/yNM0fy5qn7bQBOOU5SIyAfAjap6bT7a9wDVcZxiwANUx3GcplHMAeo5jyYXoF59ZPEFqDltM0MYSeoGjIyV/ZOwvcdthJG0+va/dJyiQkRaA/8F7EcYJZ5cUCHHcRzHcRzHyZGWvgY11+zChwG/i0+NVNXVqvoMYZ/Mn+VDznHyQTRNeSJhKvQwVV1cYCXHcRzHcRzHcch9BLUDsKSec18T1iA6jhlUNZdtcxzHcRzHcRynqGjpSZJyHUF9nZDcJhunAG8mo+M4juM4juM4juPURyqV3FGM5DqCehnwhIi8Tdj38ktgS8I6vt2Bw/Oj5ziO4ziO4ziO42wo5BSgqupTInIEMJ6wb2QKqCWMnA4GXsqboeM4juM4juM4jgNASbEOfSZEriOoRAmS/ikibYHNgMXATsAvgb8T9op0HMdxHKfIsLJ9i4XtcKz0peM4LZdc12haJecANYOBwOnAjwmjqS8kZuQ4juM4juM4juNskOQcoIrIjoTR0hOBTYC5hLWpf1PVT/Kj5ziO4ziO4ziO46Rp4TN8Gw5QRaQVIRHS6cD+wArgiahsqKq+mHdDx3Ecx3Ecx3EcB2j5a1DrncIsIuMJo6T3Ax2Bs4DOhBHUlt0rjuM4juM4juM4TrPT0AjqRcDbwM9V9V/pQhEpy7uV4ziO4ziO4ziOsxYtfAC1wSRQtwDdgedFZJqInCgi7ZtHy3GcTB68/z4GHzaQXnvtxrDjh/DWm28UWikrFjwtOIJ7JokFR7DhacExzqD+u/LVrCsLrVEvFvrTgiO4Z5JYcAQ7nklTkkruKEbqDVBV9VTClN5RhJHW24EvgL8S9kCtbQ5Bx3HgsUemMuGScQwafCRXTbye8vJyTj/1FCor5xVarQ4WPC04gnsmiQVHsOFpwTFO792347YJw0kV6XCDhf604AjumSQWHMGOp9N0UrW1ucWZItIDOAUYTghc5wL3APeq6lt5M3SKDhGpALrFimqABcBTwEWqWtmEtjYCzgOGAtsDy4DXgWtV9ZFGrp0M9FDV/bKcGwncrKo5/VYiIt2BT4GDVfWZhtpuCstWrv8fcmprazl84IH06duXMWPHA1BTU8NRRxxKv/77c+HoMet7i0Sw4GnBEdwzSSw4gg3P5nBMah/UNqWtOfP4AYw9YxBV1StoU9qaLfucm0jbSe2D6l/z5HDP5LDgCM3j2bZ18ebcueTp2YkNFI49uEfRPWfO+7yq6mxV/T3QFRgMvAGcA7wuIu/lyc8pXiYS/lDRGdgROBnYFXhJRLo0oZ2bgRHAaGBnYD/gReBhERmaqLFR5s6dw/z5nzFg/wPWlJWWltK33wBemDWzgGZ1seBpwRHcM0ksOIINTwuOaQ7pszPnjRjI6IlTmXTv84XWyYqF/rTgCO6ZJBYcwY5nvkilkjuKkZz3QU2jqquBx4HHRWRLQlbfk5MWc4qeKlX9Iva5QkReBd4FrgCGNdaAiGwMnAD8QlWnxk6NEZGehD+A3JWgs0nmVFQA0HXbbnXKu3TpSuW8uaxatYpWrVoVwKwuFjwtOIJ7JokFR7DhacExzWvvzaHnoHEsXlLNH047vNA6WbHQnxYcwT2TxIIj2PF01o2cR1CzoaoLVPVKVd0lKSHHLqq6kLBW+RgR2UhE2onIJSLyiYgsE5H3o6m3aWqB1cAhIlKa0dwZwDFJuYnIcyIyJaNsiog8l+P1l4vIEhEZkJRTrlQtWQJAWfu6CbTLyspYvXo11dXVza2UFQueFhzBPZPEgiPY8LTgmGb+gsUsXlI8Ptmw0J8WHME9k8SCI9jxzBctPUlSk0dQHacR3gLaATsAE4B9gF8B7wFHADeISHtVvU5VvxORawkjpUeKyFPATOBZVf2oMPprIyKXAGcCh6jqC819//Q68cwkH+nyYtms2YKnBUdwzySx4Ag2PC04WsJCf1pwBPdMEguOYMczX6SKd3lsIqzXCKrjZGFR9NoROAr4tapOVdWPVfUaQhbo0SKSAlDVc4FjgdeAnwGTABWRmSKyYw732zca2axzAIlksRCRccBZhORJzR6cAnQoLwegqqqqTvnSpUspKSmhXfvi2P3JgqcFR3DPJLHgCDY8LThawkJ/WnAE90wSC45gx9NZNzxAdZKmY/R6UPQ6I+P888DW0QGAqt6vqocCmwL9gSuBPYEnRaSNiIzOCEBvjLX3BrBHlmN8As/yY2AcsAqYk0B768S23cL6isy06ZWV8+jefbui2T7BgqcFR3DPJLHgCDY8LThawkJ/WnAE90wSC45gxzNftPQpvh6gOkmzN1AFfFjP+fT33HIR6R9N8QVAVZer6gxVPZ+QZKk7ITPwjdQNPsfG2lsWZZiucxC2vYmTLR135rrXTJYCfYCFhJHfgtCtW3c6derM9GnPrCmrqalh5ozn6NV730JprYUFTwuO4J5JYsERbHhacLSEhf604AjumSQWHMGOZ75o6QGqr0F1EiPKynsicC/wdlTcD3goVq0/MF9VF0b1zxKRB1Q1Myf4N4SgcoGqfhN9Xh9WABtnlPUAvmvgmvdV9V8iciowTUROUNUpDdTPC6lUihEjR3HFZZeycceO7LHnXtx79xQWLVzIsOEnNbdOvVjwtOAI7pkkFhzBhqcFR0tY6E8LjuCeSWLBEex4OuuGB6jOulImIp2i9xsBuwCXErLyXqSqn4vII8D1IrKa75MkjQLOj657HHiWsOfpeOCpqHwP4DJgsqrOTcj3ReACERkcuYwAegKvNHahqj4rIrcC14nINFX9PCGnnBly3FCWLV/O3XfewZQ7JiM79WTSTbfSpWvX5lZpEAueFhzBPZPEgiPY8LTgaAkL/WnBEdwzSSw4gh3PfNDSpzCn0tmuHCdXRKQCiG88tRSoJAScV6rq/KheO0Im3+OAzQEFrlHV22NttSNk8T0W2J7wR5OPCdvVXK+qKxvwmAz0UNX9spwbCdysqqnoczkhcdJ/EUZm7wEWA71VdYCIdAc+JSRDeiazbRHZBHgf+LeqHpljV7FsZdapxY7jOE4WNt3nzEIrNMrCVxPJwec4TpHTtnXxpsq96vn/JPb75bn9ty+65/QA1XHyiAeojuM4ueMBquM4xYIHqIXDp/g6juM4juM4juMYoYXP8PUA1XEcx3Ecx3EcxwolBYpQRaSEsAXjSML2kLOAM6IdNBq79njgLmCHxur7NjOO4ziO4ziO4zhOY4wFTickPe0NrASeFJG2DV0kIt2AG3K9iQeojuM4juM4juM4RijEPqgishFwLnCxqj6hqm8DvwA6Af/dwHUlwBTgtZyfL3ctx3Ecx3Ecx3Ecp5CkUskdTWAPoAMwPV2gqt8CrwP9GrhuNNAGuCLXG/kaVMdxHMdxigILGXItZBoGG33pOE7hibZS3CTLqUWquij2eZvotTKj3nwg6+azItILOA/YJ3Z9o/gIquM4juM4juM4jhFKSCV2AGcDn2Y5zs64bfvodXlG+XJgrTWoIlJGSIr0O1X9uCnP5yOojuM4juM4juM4Rkg4ie9EYHKW8kUZn6uj142AFbHyjYAlWa6/DvhIVf/aVCEPUB3HcRzHcRzHcTZAomm8mcFoNuZFrz8ANFb+A+C9LPVHAMtFJB28tope3xKRO1X1l/XdyANUx3Ecx3Ecx3EcIzQl+26CvAV8CwwgClBFZGNgL7JvIbNDxuefELL5DgbebehGHqA6juM4juM4juMYoSThOb65oKrLReQvwOUi8gVhneofgc+AB0WkFbAlsFhVq1V1dvx6EekSvZ2rql81dC9PkuQ4Rnjw/vsYfNhAeu21G8OOH8Jbb75RaKWsWPC04AjumSQWHMGGpwVHsOOZZlD/Xflq1pWF1siKlb50z+Sw4Ah2PFsQY4GbgZuAF4EUcKiqriBk8v0cGLK+N/EA1XEM8NgjU5lwyTgGDT6SqyZeT3l5OaefegqVlfMav7gZseBpwRHcM0ksOIINTwuOYMczTe/dt+O2CcNJFWBUpDGs9KV7JocFR7DjmQ8KtA8qqrpKVS9U1a1VtYOqHqaq/4nOVahqSlUn13Ptc9H52dnO13m+2trappltAIhIBdAtVlQDLACeAi5S1cz9fxpqayPC/j9Dge2BZYQNba9V1UdyuP5g4HfAjwkpnD8F7gf+pKpVUZ3JQA9V3S9Xryb4d4/uebCqPpPlfCVwi6penKXfMplDyBI2rpHb7g90B27PKF9BWKD9ADAummrQ2Dfw86o6oJE6jSIibYBfqeo1Tblu2UrW+westraWwwceSJ++fRkzdjwANTU1HHXEofTrvz8Xjh6zvrdIBAueFhzBPZPEgiPY8LTgCPn3THIf1DalrTnz+AGMPWMQVdUraFPami37nJtI20nsg+pf82Sx4GnBEZrHs21riu8vRhG3vjI3sQDulF7bFt1z+ghq/UwEOkfHjsDJwK7AS7E51LlwMyGL1WhgZ2A/wpD4wyIytKELReQg4AngOaBPdP3YyOXhJjg0F/vwfZ8dE5XtGyvbB7gy9rkzYbPfiRllL8ba7BIr3wEYA5wVtUPGdWdnuebohJ7tZOB/EmqrScydO4f58z9jwP4HrCkrLS2lb78BvDBrZiGUsmLB04IjuGeSWHAEG54WHMGOJ8AhfXbmvBEDGT1xKpPufb7QOmthpS/dMzksOIIdz3xRqBHU5sKTJNVPlap+EftcISKvErJOXQEMa6yBKLPVCcAvVHVq7NQYEekJnEPYwLY+fgk8raoTYmX/EZFlwKMisquqvpPj8+QdVV2Qfi8i30Rvv87oR4jtlSQiq1i7rxGR9NsvVXVl7NRcETmA0K+/jl8nIotNArt4AAAgAElEQVTruSYJCvYjPKeiAoCu29YdnO7SpSuV8+ayatUqWrVqleXK5sWCpwVHcM8kseAINjwtOIIdT4DX3ptDz0HjWLykmj+cdnihddbCSl+6Z3JYcAQ7ns664QFqE1DVhSJyO3COiIwkjED/njB9dxvgP8DVqnpLdEktsBo4REQeVtWaWHNnAO0aueUqYDcR2VZV58bKnwR2ie63FiLSFbgMOBjYBHgVGK2qs0TkSGAqsHU6oBSRWUA3Ve0afS4FvgZOBV5urF8KwErCVOmcEZG2wATgeKAjYb+mS1X1seh8a0ImsiHAVoRpzdeo6l+jr/WkqF4tMExVpyT0LI1StSTE82Xty+qUl5WVsXr1aqqrq+nQoUNz6dSLBU8LjuCeSWLBEWx4WnAEO54A8xcsbrxSAbHSl+6ZHBYcwY5nvmjpU2A9QG06bxECyx0IAc8+wK8IAc8RwA0i0l5Vr1PV70TkWsJI6ZEi8hQwE3hWVT/K4V5XE/YK+iQKIqcDM4AXVPX9bBdEo7YvENZqHg18R5j6Ok1E+gBPE4K7g4G7o/o/AVqJyA6q+jHQl7De9R/AZk3rnvwRrQM9kDB6mrk+tTHuIqwBHkrom8OBB0RkuKr+HfgNcBRwLCED2VHAjSLyXnTtZsDlhOnDuWxmnBjpdeKZyTPS5YVINZ4NC54WHME9k8SCI9jwtOAIdjwtYKUv3TM5LDiCHc98UYwJ1ZKkpQfg+SAdnHQkBDG/VtWpqvpxlEDnr8BoEUkBqOq5hKDnNeBnhJE4FZGZIrJjQzdS1ZeBPYHbCAHxeEKQ+pmInFjPZUMJI4A/V9V/qeq7wCjgQ+ACVa0GngEOieofAMwGPiAkJ4IQaD+rqt/G2n1MRJZkHsAPGu6u9WZR7F7LgAcJSZJG59qAiOxECNZPVtXpqjpbVa8jJGw6P6q2HbAUqIiykF0LDAQ+ivrsWwBV/UJVmzR6u750KC8HoKqqqk750qVLKSkpoV379s2pUy8WPC04gnsmiQVHsOFpwRHseFrASl+6Z3JYcAQ7ns664QFq0+kYvR4Uvc7IOP88sHV0AKCq96vqocCmQH9Cgp89gSdFpI2IjM4I/G6MXauqepqqdgGEMDX4K2CyiAzM4rcbMFtVP4+1UUsYud0tKnoUGBgF0QOBadH59ErzIwjTgOOcBuyR5fiynn5Kir2j++wObAuUq+qIdAbjHNkzep2VEVyfBPSMzl1PGCWtFJFXReRy4IvGNhJuDrbtFtZXZKZNr6ycR/fu2xXNX9EseFpwBPdMEguOYMPTgiPY8bSAlb50z+Sw4Ah2PPNFKsGjGPEAtensDVQRRiSzke7T5SLSP5riC4CqLlfVGap6PiHJUndCZuAbqRv0jRWRMhG5TkT2jl3/kapOAnoRpqEOboJ3CbA8ev8YIYDejTDVd1p0DIhGdXsQgtg486ORxzoHYZ1sPvkkutcnqlqpqutyv/TXpC91+3kXoqBdVZUwBfgwwij1EcDrInLc+j7A+tKtW3c6derM9Gnf7/JTU1PDzBnP0av3vgU0q4sFTwuO4J5JYsERbHhacAQ7nhaw0pfumRwWHMGOZ74oSaUSO4oRX4PaBKL1micC9wJvR8X9gIdi1foTgrmFUf2zROQBVc3Mef0NIYnSAlX9Jvocv1cJcBxQBpyScW01YbprttG9t4GTRaRzehQ1aqsv8A6Aqn4pIq9E7W5P2MamhDA1+PfAy/ER2BZAOtNxZ1V9I10oIhcB5cAFInIeMFdV7yPsd3uBiEwj/CHhHlj//UzXlVQqxYiRo7jiskvZuGNH9thzL+69ewqLFi5k2PCTCqW1FhY8LTiCeyaJBUew4WnBEex4WsBKX7pnclhwBDuezrrhAWr9lIlIp+j9RoTRtksJWXkvUtXPReQR4HoRWc33SZJG8f26xseBZwl7no4nBD4QRu8uAyZnZOddg6quFpHzgdujLVduAeYT1kqeRkhidFOWS+8iBJkPREHXt8BvCdODR8TqPUrYU/V1VV0IICJvAsNpwvpOC6jq2yLyBCHp0ZmErYKOAi4mJLiCEJxfICLVhCC/J+HrdE10/jtCIqk9CetSmzLFeL0ZctxQli1fzt133sGUOyYjO/Vk0k230qVr1+bUaBQLnhYcwT2TxIIj2PC04Ah2PC1gpS/dMzksOIIdz3xQnOOeyZFKZ7tyvkdEKoD4xkpLgUpCwHmlqs6P6rUjZPI9DtgcUMLWJLfH2mpHyOJ7LGG0sjXwMSEL7fWN7dcpIocSsvDuTdgyZgHwT+DidHArIpOBHqq6X/S5G3AVYfpuK+AVYIyqvhhrdxdCoPZnVf1dVPZnQnC9UzTlFRHpTthy5WBV/X4exfftVAK3qOrFGeUDCFNld4imAtf3fBXAFFUdk1F+UtRHpbnuadrQNSLSnvBHgSGEtabpbWRuis6XErL0DiFMf/4cuAMYr6qrRGQzwtd/b0KyqYm5OC1bWbiRV8dxHCd5Nt3nzEIr5MTCV/9SaAXHMU3b1sUbB979emViv18ev1eXontOD1AdJ494gOo4jtOy8ADVcTYMPEAtHD7F13Ecx3Ecx3EcxwgtPUuxB6iO4ziO4ziO4zhGaOnbsLT053Mcx3Ecx3Ecx3GM4COojuM4juM4juM4RvApvo7jOI7jOI7jOE5R0LLDU5/i6ziO4ziO4ziO4xQJPoLqOI7jOI6TI1a2b/HtcByn5eJTfB3HcRzHcRzHcZyioKVPgW3pz+c4juM4juM4juMYwUdQHcdxHMdxHMdxjOBTfB3HcRzHcRzHcZyioGWHpz7F13Ecx3Ecx3EcxykSPEB1HCM8eP99DD5sIL322o1hxw/hrTffKLRSVix4WnAE90wSC45gw9OCI7hnvhjUf1e+mnVloTWyYqUvLXhacAQ7nkmTSiV3FCMeoDqOAR57ZCoTLhnHoMFHctXE6ykvL+f0U0+hsnJeodXqYMHTgiO4Z5JYcAQbnhYcwT3zRe/dt+O2CcOLcv2blb604GnBEex45oMSUokdxUiqtra20A7OOiAiFUC3WFENsAB4CrhIVSub0NZGwHnAUGB7YBnwOnCtqj6Sw/UHA78Dfgy0BT4F7gf+pKpVUZ3JQA9V3S9Xryb4nwTcDpSq6sp1bKM7wftgVX0mKbdlK1nvH7Da2loOH3ggffr2ZczY8QDU1NRw1BGH0q///lw4esx6eyaBBU8LjuCeSWLBEWx4WnAE90yT5D6obUpbc+bxAxh7xiCqqlfQprQ1W/Y5N5G2k9gH1b/myWHBEZrHs23rIo3egMfe+TKxAG7wrlsX3XP6CKptJgKdo2NH4GRgV+AlEenShHZuBkYAo4Gdgf2AF4GHRWRoQxeKyEHAE8BzQJ/o+rGRy8NNcCg08wj9OKPQIpnMnTuH+fM/Y8D+B6wpKy0tpW+/Abwwa2YBzepiwdOCI7hnklhwBBueFhzBPfPBIX125rwRAxk9cSqT7n2+0DprYaUvLXhacAQ7nvmipU/x9Sy+tqlS1S9inytE5FXgXeAKYFhjDYjIxsAJwC9UdWrs1BgR6QmcA9zVQBO/BJ5W1Qmxsv+IyDLgURHZVVXfyfF5CoaqrgK+aLRiAZhTUQFA12271Snv0qUrlfPmsmrVKlq1alUAs7pY8LTgCO6ZJBYcwYanBUdwz3zw2ntz6DloHIuXVPOH0w4vtM5aWOlLC54WHMGOZ75IFe/gbiJ4gNrCUNWFInI7cI6IjCSMkv+eMH13G+A/wNWqekt0SS2wGjhERB5W1ZpYc2cA7Rq55SpgNxHZVlXnxsqfBHaJ7rcWItIVuAw4GNgEeBUYraqzRORIYCqwtaouiOrPArqpatfocynwNXBqlrbbNfTMIjIAmA6cD1wIfA4cDXxENMVXRHYErgX2BVoBLwHnqepbjfRH4lQtWQJAWfuyOuVlZWWsXr2a6upqOnTo0Nxaa2HB04IjuGeSWHAEG54WHME988H8BYsLrdAgVvrSgqcFR7Dj6awbPsW3ZfIWIbDcAbgHOAU4lzD992bgBhE5C0BVvyMEYiOA+SJyl4j8UkR2VNUvVbWikXtdDWwGfCIi00VkbBQA1qrq+6q6LPOCaNT2BeCHhMBwH0JwOE1Efgw8TVgHe3Cs/k+AbURkh6iZvoT1rv/I4tTgM8c4BvgpMJywhjfO34H5kdtPovNTRaTZ/2SVXieemZQiXV5SJPMzLHhacAT3TBILjmDD04IjuOeGiJW+tOBpwRHseOaLlj7F1wPUlsmi6LUjcBTwa1Wdqqofq+o1wF+B0elgS1XPBY4FXgN+BkwCVERmRiOJ9aKqLwN7ArcRAuLxhNHJz0TkxHouGwpsBfxcVf+lqu8Co4APgQtUtRp4Bjgkqn8AMBv4ANg/KjsCeFZVv403HE1LbvSZI65U1Y9UNVtO8u0II7RzVPV9QgB/MgX4melQXg5AVVVVnfKlS5dSUlJCu/btm1spKxY8LTiCeyaJBUew4WnBEdxzQ8RKX1rwtOAIdjzzRUvP4usBasukY/R6UPSamfjneWDr6ABAVe9X1UOBTYH+wJWEwPNJEWkjIqNFZEnsuDF2rarqaaraBRDC1OCvgMkiMjCL327AbFX9PNZGLTAzOgfwKDAwCigHAtOi8+nV8EcQpgFnazunZwY+znJ9mj8Q1t9+LSKPEUZb34zWqjYr23YL6ysy06ZXVs6je/ftiibdvwVPC47gnkliwRFseFpwBPfcELHSlxY8LTiCHU9n3fAAtWWyN1BFGJHMRvrrvlxE+ovItekTqrpcVWeo6vmEJEvdCdNkbwT2iB1jRaRMRK4Tkb1j13+kqpOAXoS1nYOb4F0CLI/eP0YIJncjTPWdFh0DolHdHoQgtiltE2sfYGl9lVX1fwnrV88ijEhfDLwhIp2bcM9E6NatO506dWb6tO93v6mpqWHmjOfo1Xvf5tapFwueFhzBPZPEgiPY8LTgCO65IWKlLy14WnAEO575oqVP8fUkSS2MaL3micC9wNtRcT/goVi1/sD8KKHSxsBZIvKAqmbm5f6GkERpgap+E32O36sEOA4oI6z5jFNNWEf6VRbNt4GTRaRzehQ1aqsv8A6Aqn4pIq9E7W5P2MamhDA1+PfAy/ER2Iy2G3vmLJfVea7OwBjgClWdTBgJ7kxYk7o/cHeDDSRMKpVixMhRXHHZpWzcsSN77LkX9949hUULFzJs+EnNqdIgFjwtOIJ7JokFR7DhacER3HNDxEpfWvC04Ah2PPNFsQaWSeEBqm3KRKRT9H4jQtbcSwlZeS9S1c9F5BHgehFZDbxHmBo7ipDBFuBx4FnCnqfjgaei8j0IWXYnZ2TnXYOqrhaR84Hbo6DvFkIQtx1wGiGJ0U1ZLr2LEGQ+ICLnAd8CvyVMDx4Rq/coYU/V11V1IYCIvElIajS6HqcPcnjmxlgQXbO9iPw+8juJkCjp3zm2kShDjhvKsuXLufvOO5hyx2Rkp55MuulWunTtWgiderHgacER3DNJLDiCDU8LjuCeGyJW+tKCpwVHsOPpNJ1UOtuVYwsRqQDimz8tBSoJAeeVqjo/qtcOmEAY6dwcUOAaVb091lY7wnrLYwmjla0J6zNvB65X1ZWNuBwKnE2YWrwJIcD7J3BxOrgVkclAD1XdL/rcDbiKMH23FfAKMEZVX4y1uwthT9c/q+rvorI/EwLNnVRVo7KTItdSVV3Z2DPHtpnZQVVnR2XdgU/5fpuZnoR1uL0JI8RvEYL+dACfE8tW4j9gjuM4TrOz6T5nFlohJxa++pdCKzhOVtq2LtIMQsDTH3yd2O+XB/fcouie0wNUx8kjHqA6juM4hcADVMdZP4o5QJ32YXIB6oE7FV+A6kmSHMdxHMdxHMdxnKLA16A6juM4juM4juMYIVW8g7uJ4AGq4ziO4ziO4ziOEVp6Fl+f4us4juM4juM4juMUBT6C6jiO4ziO4ziOYwSf4us4juM4juOYwkp2XAvZhq30pbPhUNKy41Of4us4juM4juM4juMUBz6C6jiO4ziO4ziOYwSf4us4juM4juM4juMUBZ7F13Ecx3Ecx3Ecx3GaAR9BdRzHcRzHcRzHMUILH0D1EVTHscKD99/H4MMG0muv3Rh2/BDeevONQitlxYKnBUdwzySx4Ag2PC04gnsmiQXHOIP678pXs64stEa9WOhPC45gxzNpSlKpxI5ixANUxzHAY49MZcIl4xg0+Eiumng95eXlnH7qKVRWziu0Wh0seFpwBPdMEguOYMPTgiO4Z5JYcIzTe/ftuG3CcFJF+ou3hf604Ah2PJ2mk6qtrS20wwaPiDwH9K/n9CfADxtpYjwwGfg0o3wVsAB4FvidqlY24FABdIsVrQDmArcCf1LV9fpGEZEtgKNU9dYmXPMc9ffLrao6cn2cmoNlK1nvH7Da2loOH3ggffr2ZczY8QDU1NRw1BGH0q///lw4esx6eyaBBU8LjuCeSWLBEWx4WnAE90yS5nBMah/UNqWtOfP4AYw9YxBV1StoU9qaLfucm0jbSe2D6l/z5GgOz7ati3cm7UuzFyUWwPXusUnRPaevQS0eHgSy/S+9FGgf+3wt0B04Kla2BNgien8sMDN6X0IIbm8FnhCR3RsJNCcCf4retwN6RddWAdfn+iD1cA3QNWqvKTTULxsEc+fOYf78zxiw/wFrykpLS+nbbwAvzJrZwJXNiwVPC47gnkliwRFseFpwBPdMEguOaQ7pszPnjRjI6IlT2axjGb8ZdmChldbCQn9acAQ7nnmj6ELKZPEAtXhYpqpf1HPu2/QbEakGajLrRiOUAAszzs0XkYuBu4DdgLcacKjKuPZTEdkfOIX1D1DX9UepoX7ZIJhTUQFA12271Snv0qUrlfPmsmrVKlq1alUAs7pY8LTgCO6ZJBYcwYanBUdwzySx4Jjmtffm0HPQOBYvqeYPpx1eaJ2sWOhPC45gx9NZNzxA3TBYGb0uW4drq+MfRGQysDFhVPenwNXRqZGq2iVWbyRws6qmomuGRuW1wHaqWiEiRwLjgF2A+YTR0nGq2qTRUREZDpwD7Ah8A9wDXKSqy2L3vBQYThgZPgj4APg9MALYGvgouvcj0TWbAH8GfgZsBLwJjFbVWU1xS4KqJUsAKGtfVqe8rKyM1atXU11dTYcOHZpbay0seFpwBPdMEguOYMPTgiO4Z5JYcEwzf8HiQis0ioX+tOAIdjzzRaqFD6F6gNqCEZES4EfAGEKA9XETr98HOB64JOPUz6I2f01Yq3pyI039BugA/AA4GlggIocD9wG/BZ4iTFueCOwODGyC49mEQPJ84AnC895AmNp8dKzqmcBhhJHcdwkjwr8AzgBei94/KCK9o8//IAT0g4GFwBBguogcqKozcvVLgvQ68cyED+nyYsnAZsHTgiO4Z5JYcAQbnhYcwT2TxIKjJSz0pwVHsOOZL1r443mAWkQMEZH/yih7W1V/2sR2HhORVdH7jQgB2QzgVFVd3ci1F0QBH0AboBR4Fbg3o963wOXp9awi0mCjqrpYRJYBK9LTdUVkNHCLqk6Kqn0iIiOAV0RkD1V9Myqvt19EJAVcCNyoqtdG5z6OAvMHRGRnVX0/Kr9LVV+O7l0OjAJ+q6r3RecvE5HWhBHWA4HewFaquiA6f4mI/IQwUtusAWqH8nIAqqqq2HyLLdaUL126lJKSEtq1b1/fpc2KBU8LjuCeSWLBEWx4WnAE90wSC46WsNCfFhzBjme+aOHxqW8zU0Q8DuyRcQxZh3ZOi13fAyhX1QNUdTaAiNwoIktix+jYtTfHrt0dOBRYDvxbRDaN1ftkfbP6AnsCo+IuwPToXM9YvYb6ZSvC9NzMgPH56HW3WFl89FgIAfhL8YtUdbyqzozcIKzBjfsdnOHWLGzbLayvyEybXlk5j+7dtyuaVPoWPC04gnsmiQVHsOFpwRHcM0ksOFrCQn9acAQ7ns664QFq8bBEVWdnHOuykdP82PVzVLU64/xY6gZ7N8bOLYxd+4GqPgkcR5h+e1ysXuYa0WzBamkjniWE9auZwecOwP+L1VuXfkl/Xy+vx3lFDtcvzeK2M02YfpwU3bp1p1Onzkyf9syaspqaGmbOeI5evfdtbp16seBpwRHcM0ksOIINTwuO4J5JYsHREhb604Ij2PHMG6kEjyLEp/huYKjqV8BXTbgkHew1lAptBVAuIqnYyGqPjDqZQew7gKRHdgFE5MfARcDZwHeNianqlyLyJdAPeCB2Kr136nv1XDobqAH2AV6P3f854DngFUISqPaq+nbs/LWEZE5/ohlJpVKMGDmKKy67lI07dmSPPffi3runsGjhQoYNP6k5VRrEgqcFR3DPJLHgCDY8LTiCeyaJBUdLWOhPC45gxzNfeJIkZ0OiTEQ6Re9TQBfgcsI+qw81cN2LhMy+vxeRu4E+hIy5cb4DthGR7YB5wBWEpETjCVvgdAZuAhYDFU1w/iPwZxH5hDAdeFfCXrFTVfWjbBeo6lIRuQ4YHwW47xCSQe1LWGP6FiFwvUdEzop8TiYkhToqW5v5ZshxQ1m2fDl333kHU+6YjOzUk0k33UqXrl0LoVMvFjwtOIJ7JokFR7DhacER3DNJLDhawkJ/WnAEO55O00mls105hSMauatU1RNyqDsZ6KGq+2WUdwc+BQ5W1WeyXNpYuxVAfDOp1YTstc8TEiK91sj9RxMy5W4aXXMvcLuqpqLzexGC3E7AAFV9SUSOAUYTMu8uIgSYF6jq19E1z5FDv4jIaYRswNsDnwNTgEsztpkZpaq3xK5pQ8hOPAzYjJDZ9w+q+lR0fnNCduDBQDnwIXCZqsZHahtl2cqs058dx3EcxwE23efMQis0ysJX/1JoBacAtG1dvMOUr1V8m9jvl3t337jontMDVMfJIx6gOo7jOE79eIDqFCvFHKC+nmCAulcRBqieJMlxHMdxHMdxHMcpCnwNquM4juM4juM4jhUKNOYpIiXAOGAkYVnfLOCMeNLTjPo/JCyZ60uIO18GzlPV+hKZAj6C6jiO4ziO4ziOY4ZUgv+ayFjgdGAU0BtYCTwpIm0zK4pIOfAM0I6wTWM/QtLU6SKyVUM38QDVcRzHcRzHcRzHqRcR2Qg4F7hYVZ+ItmL8BSEB6n9nuWQQYUeQ41T1TVV9l5CctIxGdsXwANVxHMdxHMdxHMcIqVRyRxPYA+gATE8XqOq3hK0Z+2Wp/wJwuKoujpXVEiYob9bQjXwNquM4juM4juM4jhGSXIIqIpsAm2Q5tUhVF8U+bxO9VmbUmw+stfmsqs4D5mUUnw20BZ5oyMkDVMdxHMdxHKcgWNjCxcJWOGCjL52i5GxC4qNMxgMXxz63j16XZ9RbTgg6G0RE/hu4DLhGVd9pqK4HqI7jOI7jOI7jOFZINovvRGBylvJFGZ+ro9eNgBWx8o2AJQ3dQETOAq4B/gac35iQB6iO4ziO4ziO4zhGWIfsu/USTePNDEazkZ6u+wNAY+U/ALJuGxNtS3MtcCbwR2C0qtY2diMPUB3HcRzHcRzHcZyGeAv4FhhAFKCKyMbAXsAN9VxzA2FLml+pan111sIDVMdxHMdxHMdxHCM0MftuIqjqchH5C3C5iHwBfEoYFf0MeFBEWgFbAotVtVpEjgZOAy4HHhKRTrHmlqhqvdOCfZsZxzHCg/ffx+DDBtJrr90YdvwQ3nrzjUIrZcWCpwVHcM8kseAINjwtOIJ7JokFR7DjmWZQ/135ataVhdbIipW+tOKZNKkEjyYyFrgZuAl4MWriUFVdQcjk+zkwJKp7QvQ6OiqPHxc2dBMPUB3HAI89MpUJl4xj0OAjuWri9ZSXl3P6qadQWZmZvbuwWPC04AjumSQWHMGGpwVHcM8kseAIdjzT9N59O26bMJxUIYbCGsFKX1rxbEmo6ipVvVBVt1bVDqp6mKr+JzpXoaopVZ0cfT46+pztGNPQfVK1tY2uU3WcOojIZKCHqu6XY/3RwDmE9NTDgfuBUap6S2ZbIvIjoJuqPr6ejvsBqOqs6HNt+p7r025TWbaS9f4Bq62t5fCBB9Knb1/GjB0PQE1NDUcdcSj9+u/PhaMb/BlvNix4WnAE90wSC45gw9OCI7hnklhwhPx7JrnNTJvS1px5/ADGnjGIquoVtCltzZZ9zk2k7SS2mfGv+fe0bZ1wrtwEefezJYkFcD/apkPRPaePoDp5RUQ2J+x5dBOwE2Fj3s7AXfVc8g9gn/W8ZytgJtAjVtzQPYuauXPnMH/+ZwzY/4A1ZaWlpfTtN4AXZs0soFldLHhacAT3TBILjmDD04IjuGeSWHAEO54Ah/TZmfNGDGT0xKlMuvf5QuushZW+tOKZL1IJ/itGPEmSk282iV6fVtW50fulDdRP4idlrTZU9YsE2i0IcyoqAOi6bbc65V26dKVy3lxWrVpFq1atCmBWFwueFhzBPZPEgiPY8LTgCO6ZJBYcwY4nwGvvzaHnoHEsXlLNH047vNA6a2GlL614OuuGB6jOeiEiFcAkoBdwCPANMJUwpXc/YHpU9VkRmaOq3eubbhu1tQ0wTkROiupWAA9Gbf8AOB54CfgzMAjYClgIPAacpapVQE3U5O1ROwMy7ykiwyPHHSPne4CLVHVZdL4WOBU4NnqOz4C/qeql699rTaNqSUhyVta+rE55WVkZq1evprq6mg4dOjS31lpY8LTgCO6ZJBYcwYanBUdwzySx4Ah2PAHmL1hcaIUGsdKXVjzzRREuXU4Un+LrJMF44HlgT+Aqwma8QwnZvfaN6hxD41N39yFk9roqo+6ZwPnAQcAM4G/Aj4GjgR2A3xIyhZ0e1e8SvZ4d1amDiJwN3ALcDuwO/Dq6/u6Mqv8T3Wt3wrrZS0SkfyPPkDjpdeKZiRTS5SVF8r+UBU8LjuCeSWLBEWx4WnAE90wSC45gx9MCVvrSime+KGAW32bBA1QnCZ5S1etU9WNVvRZ4D/hplHL666jON6q6oKFGoubmvI0AACAASURBVPOrCXsjxes+par/UNXXVXUp8DRwsqq+HGUMuwv4N7BrVP/L6HWxqn4Tv4eIpAiprW9U1Wsj54cJQfDPRGTnWPU7VHWKqn5ESJH9HfDTJvVMAnQoLwegqqqqTvnSpUspKSmhXfv2za2UFQueFhzBPZPEgiPY8LTgCO6ZJBYcwY6nBaz0pRVPZ93wANVJAs34vBhok2D7H2d8ngRsLyJXi8ijIvIJYaQ2l8UGWwFbE0Zi46QzFewWK1vzXKpaC3xLss+VE9t2C+srMtOmV1bOo3v37YomRb0FTwuO4J5JYsERbHhacAT3TBILjmDH0wJW+tKKZ95o4UOoHqA6SbA8S1mS3/JrkiqJSAnwOHA9sAL4O3A48MJ63iP9sxB/lnw/V05069adTp06M33aM2vKampqmDnjOXr13reBK5sXC54WHME9k8SCI9jwtOAI7pkkFhzBjqcFrPSlFc984Vl8Had5aWxfpz0ICZP+P3vnHS9XVbXh5wZCCwEB6aEKvCAdAWkJARFQmopIRwIIIk06UkOv0gVFQo1UFRAFQZAOKkiVsmhCCKHJR0ILIQn3+2OdSc6dzC0hk9n7JOvJ7/7unX32zLz3ZO7MWXuv9a71zOwhAEm98ZYyNZfgTh/DzN6R9A4wAPh96VCttvTZLyN6atLW1sZue/yEU08+kTnmnJNVVl2N664ZysgPPmDnXXZNLW8CVdBZBY0QOptJFTRCNXRWQSOEzmZSBY1QHZ1VoCrnsio6gy9HBKhBbnwELCNpITMb0eD428A44EeSRgDzAEcBCwAzA5jZeEmjga9Lms/M3q17jNOAM4rU4L/gtavnATcX9abZse32O/LZmDFcc/VVDL3qCrTsclx8yRD6LbJIamkdqILOKmiE0NlMqqARqqGzChohdDaTKmiE6uisAlU5l1XROTWY5jOYa25XQdBTJF0BLGVm6xVtYIaa2dGl4w8CL5vZrpKWwmtINzCze4vjE1q+lB+rOLYb7uL7BV4r+nKDx98Bdw5eBA9Y/4yn+24NLGFmX0g6BjgceMXMVm7QZmYv3P13Sdw5eChwYl2bmQ6tcCQNBy41s8E9PVefjet2RzgIgiAIgoyZa419U0voER88emFqCdMUs8yYaf4r8OLbnzbt+nKZBWbL7veMADUIpiIRoAZBEARBtYkAdfokAtR0RIpvEARBEARBEARBVcgupGwuEaAGQRAEQRAEQRBUhFzdd5tFtJkJgiAIgiAIgiAIsiB2UIMgCIIgCIIgCCrCtO7iGwFqEARBEARBEARBRZjG49NI8Q2CIAiCIAiCIAjyINrMBMFUJNrMBEEQBEHQCqIdTnPJuc3MK++Nbtr15dfmnTW73zNSfIMgCIIgCIIgCCpCuPgGQRAEQRAEQRAEQQuIHdQgCIIgCIIgCIKKEC6+QRAEQRAEQRAEQRZM4/FppPgGQRAEQRAEQRAEeRABahBUhD/ceANbfGdj1lxtJXbeYVueevKJ1JIaUgWdVdAIobOZVEEjVENnFTRC6GwmVdAIoXNqsdn6K/Lug2elltGQqp3LptHWxK8MiQA1CCrArbfczEknHMdmW2zJL8+9gL59+7L3nrszfPgbqaV1oAo6q6ARQmczqYJGqIbOKmiE0NlMqqARQufUYq2Vl+Cyk3ahLcOix6qdy2bS1sR/ORJ9UKcxJG0H7A+siC9AvARcDZxnZuPq5n4f2AdYBZilNPdCM/u8NO9eYLiZ7TQZOibrPpIGA3uYWb+ePkc3j9cb2M/Mzi5u7wpcDvSuPw9Tk2b0QW1vb+e7G3+Ldfv35+hjjwdg7NixbLX5pgxYfwOOOPLoKdbZDKqgswoaIXQ2kypohGrorIJGCJ3NpAoaIXTWaGYf1Jl6z8i+Owzk2J9txiejP2em3jMy77oHN+Wxm9EHtRX/5zn3QX39/TFNC+AWm2fm7H7P2EGdhpA0CA/CrgbWwAPP84BjgIvr5l5YzPsbMABYFbgAOBC4T9LsrVMOwFmFhmaxC/DL0u3rgQVbGZw2i2HDXmfEiDcZuMGGE8Z69+5N/wEDeejBBxIq60gVdFZBI4TOZlIFjVANnVXQCKGzmVRBI4TOqcEm636dQ3bbmCPPvZmLr7svtZxJqNK5nBq0tTXvK0fCxXfaYh/gcjMrB6MvFcHmuZIONbORkrYFfgpsYGYP1M29A3gaDxh/2irhZvYx8HETH7LDn5yZjQZGN/HxW8brr70GwCKLLtZhvF+/RRj+xjDGjx/PDDPMkEBZR6qgswoaIXQ2kypohGrorIJGCJ3NpAoaIXRODf797Osst9lxjPp4NEft9d3UciahSudyapBpXNk0IkCdthgPrC1pHjN7vzR+Ob5TWgsAfw78pS44BcDM3pR0DnC0pMPNbFQzhElqB/YEfgSsB7wJXGlmJxbHB1NK8ZU0M3AisCPwFeA54CQzu6X0mKsCpwNr48Hnn4GDgO8Bvy0976DSeehtZuMkzQ0cD2wFzAc8C5xQe/wiJXgwcBy+A70g8BRwqJk91Ixz0lM++dj/2/rM1qfDeJ8+ffjiiy8YPXo0s8/e6g3vSamCzipohNDZTKqgEaqhswoaIXQ2kypohNA5NRjxXlMu/6YaVTqXweQTKb7TFqfitafDJd0m6XBJ3wQ+NbMXisCsN/BN4MEuHuduYGZg9SbrOxO4ElgZuBE4QdL6ncy9CtgE2LmYfyVwvaQdASQtAdwP/A9YB9gS/72uwNN5a4USCxa3JyBpBjxg3wjYrXj8vwI3SdqyNHUhfBd5JzwNujdwlaSW/t3U6sTrDQpq470yyc+ogs4qaITQ2UyqoBGqobMKGiF0NpMqaITQOT0yvZ/LaT3FNwLUaQgzuxnfTfwDXoN6GvAP4BVJ3ymmfRXPDPigi4f6X/F9viZLvMrMhprZi8CRwEd4cNkBSUvhO627m9nfzexlM7sQGAIcWkzbExgF7Gpmz5jZP4DdgWeAMcCHAGb2dpHeW2ZjYDVgRzO7y5yjgL8A5ar63sA+ZvYPM/s3fj6XBOaf8lPRc2bv2xeATz75pMP4p59+Sq9evZh1ttlaKadTqqCzChohdDaTKmiEauisgkYInc2kChohdE6PxLmctvvMRIA6jWFmjxbOufPhO4OH4q++WyQtD7wPtANzdfEwcxffuwpiv5S8ks52PIicqcG8mlnSvZI+rn0BewDLFcdWBB4vuw0XgeQxZvZFNzpWAj4xs8frxu8rHrehZjwgphPNU41FF/P6inrb9OHD32DxxZfIxvq9CjqroBFCZzOpgkaohs4qaITQ2UyqoBFC5/RInMtpmwhQpxEk9ZP0K0mLgQeAZva0mZ0FrIUHpZsWAd2/gIFdPNxAvJ71X02WOabBWKN3kNrrciDuRFz7Wr74Avh80rtNFo3suXs1eNyeap5qLLbY4iywwILcc/ddE8bGjh3LA/ffy5prrd1KKV1SBZ1V0Aihs5lUQSNUQ2cVNELobCZV0Aihc3pkej+X03qKb5gkTTuMxncY38bNhcp8CIwD3i1unw1cK+lbZnY3gKSheErruXirmavN7P9aIbwBzxTfFzKzx2qDko4E5sHrS58HdpE0Y611jKSN8drVZWkcgNZ4Gphd0mp1u6jr42ZJWdHW1sZue/yEU08+kTnmnJNVVl2N664ZysgPPmDnXXZNLW8CVdBZBY0QOptJFTRCNXRWQSOEzmZSBY0QOqdHpvdzmWlc2TQiQJ1GMLP3JZ0CHCdpDuBaPEV3aeAQ4DXg98XcGyT1B/4k6STgZtyE6GLg4eJ+9d2YF5S0aYOnvqvZvUXN7DlJfwIuktSGB6ybAyfgDsQAFwL7A5dIOgtPWT4XeKBopfMRgKQ18GC2zJ3A48BQSfsBw/G+qd8Fvt/M36VZbLv9jnw2ZgzXXH0VQ6+6Ai27HBdfMoR+iyySWloHqqCzChohdDaTKmiEauisgkYInc2kChohdE6PTM/nMtedz2bRVnO7CqYNJO0A7IXXWfYBRuAB6Il1rWeQtDXeO3VlYBbgVbxVyxbAWGA/M3tQ0r347mIj5jKzkQ103AsML+pha+1efmJml5bmDAcuNbPBDdrMzAqcBGyH75r+Fzi/3ONV0tq4cdGaeH3oH4AjzOwjSV8pfpc1cUOm/9Gxzcw8wBm4++/seAuZk83s1uKxdy3PL8Y2wt1/lzCz1zo5Hx34bFyXO7lBEARBEARNYa419k0toUd88OiFqSX0iFlmzHej8q1Rnzft+nLBOWfK7veMADWYhKIVzY7A0w2MhKbWc54E7GBmS7bi+VpFBKhBEARBELSCCFCbS84B6tujxjbt+nKBOXtn93tGim8wCWY2Fu8n2hIkfQNvNzOsVc8ZBEEQBEEQBJUku5CyuUSAGiRF0sLAvXgK7qC0aoIgCIIgCIIgSEkEqEFSzOxNoG9qHUEQBEEQBEFQBabxDdQIUIMgCIIgCIIgCKrCtO7i2yu1gCAIgiAIgiAIgiCAcPENgqlKuPgGQRAEQRBMpCpuw6OfuDDbfcr3PhrXtOvLefvOmN3vGSm+QRAEQRAEQRAEVSG7kLK5RIpvEARBEARBEARBkAWxgxoEQRAEQRAEQVARpvEN1AhQgyAIgiAIgiAIqkK4+AZBEARBEARBEARBC4gANQgqwh9uvIEtvrMxa662EjvvsC1PPflEakkNqYLOKmiE0NlMqqARqqGzChohdDaTKmiE0NlMqqCxzGbrr8i7D56VWkbLaGvivxyJADUIKsCtt9zMSSccx2ZbbMkvz72Avn37sveeuzN8+BuppXWgCjqroBFCZzOpgkaohs4qaITQ2UyqoBFCZzOpgsYya628BJedtAtt03rea4m2tuZ95Uj0Qc0QSdsB+wMr4osILwFXA+eZ2bhizurAMcB6wOzAm8CfgJPN7L1izkDgHmBpM3u57jlmBMYCg8zsik50LA78t274U+A54AQzu3UKf1UkrQAsZmZ/mYz7DAJOAuYBjjSzs6dUx9SiGX1Q29vb+e7G32Ld/v05+tjjARg7dixbbb4pA9bfgCOOPHqKdTaDKuisgkYInc2kChqhGjqroBFCZzOpgkYInc2kFRqb1Qd1pt4zsu8OAzn2Z5vxyejPman3jMy77sFNeWzIuw/qB5+Ob1oAN9dsM2T3e8YOamYUwdfleEC6BrAKcB4ejF5czFkeuB94DdgQELAPsBFwj6SZmizrR8CCwELAN4BbgT9KWq0Jj307/ntODucBdwHLAEOaoCFrhg17nREj3mTgBhtOGOvduzf9BwzkoQcfSKisI1XQWQWNEDqbSRU0QjV0VkEjhM5mUgWNEDqbSRU01thk3a9zyG4bc+S5N3PxdfellhM0kXDxzY99gMvN7OLS2EuSZgfOlXQoMAh4zcwOKM15TdJw4GlgEzyIbBYfmNnbxc9vASdI2gHYBXh8Ch97slZtJM0A9AXuNbNhU/jcleD1114DYJFFF+sw3q/fIgx/Yxjjx49nhhlmSKCsI1XQWQWNEDqbSRU0QjV0VkEjhM5mUgWNEDqbSRU01vj3s6+z3GbHMerj0Ry113dTy2kpuabmNosIUPNjPLC2pHnM7P3S+OXA34CPizmLSFrZzJ6qTTCzZ4qU2ddboHN0+Yak14A/4MHxQsAOwBHAcDPbqTRvKNDPzAYW91kYOE7Srma2uKRewKHAXviu7ct4avOldSnHl0m6zMzaJM0K/ALYsXi8V4GzzezS4jkH4qnOhxaa3gJWA+YEzgQ2B2YG/gEcaGbPFvdbvjg+APgEuA84pNWB8ScffwxAn9n6dBjv06cPX3zxBaNHj2b22WdvpaSGVEFnFTRC6GwmVdAI1dBZBY0QOptJFTRC6GwmVdBYY8R7o1JLCKYSEaDmx6nA74Hhku7Bg6J7gUfN7AUASb8BdgOekPQv4O/AA/iu4rNTU1xRu7od8PVCQ5l9ge8B7wAv4MFgV6wBPAVcA5xejJ1aPP6+wLPAOsD5kuYr5vQDhgM/B64v7nNt8Vj7FPfZHLhI0mxmdn7p+bYuHq8P0I4H/O3AD4B3gZOBv0n6GjA3nkZ9HXAwMAtwFPBPSSvULR5MVWp14vXF/7XxXpkso1VBZxU0QuhsJlXQCNXQWQWNEDqbSRU0QuhsJlXQGJCt+26ziBrUzDCzm4G18d3INYDT8J29VyR9p5jzKrAycA7wVXz38DbgHUmHNXjYpyR9XP4CRk6GrFtL9/sMr4+9HHimbt6dZna7mT1uZp/24Hd9D/gC+NjM3ivSmA8ADjazW83sVTMbigeth+DB5DvF3UeZ2duSlgO2AvYzs5vN7CUzOwf4DXCkpPJf8Flm9qKZPQF8C6/v3cnMHjAzA36CB6RfBfYGRpjZPmb2fHGfHfBAdefJOHdTzOx9+wLwySefdBj/9NNP6dWrF7PONlsr5XRKFXRWQSOEzmZSBY1QDZ1V0Aihs5lUQSOEzmZSBY3BtO/iGwFqhpjZo0Va7Hx4IHooXqt5S5F2ipmNMLODzWwpYDG8LvUZ4HRJe9Y95BZ4MFb++kZ5gqRn64LY/qXDe9Xdd0dgMzyILvPSFP7qy+GptlfVBdMnAHMB8ze4z0rF9/vrxu8r5pfvU9a3Ih4YP1cbMLMPzOwgM3sDWBVYrk7H/wFzFDpbxqKLeR1Ivb378OFvsPjiS2Rjq14FnVXQCKGzmVRBI1RDZxU0QuhsJlXQCKGzmVRBYzDtEwFqRkjqJ+lXkhYDMLN2M3vazM4C1sJ3EDeVdIakjWv3M7NhRauYAcATeEBaZpiZvVz+Al6pm/NdOgahj5WOjSjd9z9mdg2+a7ulpK+X5tXvmjaywO7dxSmovR53qNOyIrA08F4X9+3sscZ0ou/zTvSV738/kwb2wh2VW8Ziiy3OAgssyD133zVhbOzYsTxw/72sudbarZTSJVXQWQWNEDqbSRU0QjV0VkEjhM5mUgWNEDqbSRU0Br5r1ayvHIka1LwYDewBvA2cWHfsQ2AcXiu5A7CapL+Z2YQgy8zGSxpVzJkszGwSYyVJXd2lFgB2ZeX2Ob7jWGYp4KPS7XKQ+ALem3XRItW5pmN3PPgexKSLKk8X3wcAfyyNr48H1h908ns8D/SVpCK9F0l9cROmHfDd6B1xk6fPiuN98HrZS4Ae922dUtra2thtj59w6sknMsecc7LKqqtx3TVDGfnBB+y8y66tktEtVdBZBY0QOptJFTRCNXRWQSOEzmZSBY0QOptJFTQG5BtZNokIUDPCzN6XdAruajsHbv7zAb57eAje9/T3uAvtbcBNks7DXWv74f1Kv4EbDDWTuSQtUPzcC0+rPRFvMfOfLu73MHCYpC1w86Ld8PTYf5XmfAQsI2khMxsh6WK8jc1I4EG8Hvd84GIz+6Jw+Z2AmT0v6RbgAklfMNEk6Sd4anRn3AU8iqcTHwCMwk2SPip0v4inNl8r6XjcOfkUYF2af367Zdvtd+SzMWO45uqrGHrVFWjZ5bj4kiH0W2SRVkvpkirorIJGCJ3NpAoaoRo6q6ARQmczqYJGCJ3NpAoag2mbtporV5APRY/RvfBAsA8wArgZOLHmHitpTdwldx3ccXYU3krl+FKblIHF2NJFWm/5OWbEdysHFenBjXQszsS2LjXG4Tu8twAn1fqjFi1jhprZ0aX79wUuxJ192/GAexSwlpkNLObsBvwSN0uav5h3BLA73jLmTdyQ6eQiQJ1Ed9Fm5iRge2AewIBzzOzyrs6DpIWAs4FN8bWo+4GDzOyl4vjKuElV/+L3/idwuJk92eh8NeKzcV2mEQdBEARBEExXzLVGy9f5vxSjn7gw233Kj8c0L4Cbfeb8CosjQA2CqUgEqEEQBEEQBBOJAHXK+eTz5gVwfWbKL0ANk6QgCIIgCIIgCIIgC6IGNQiCIAiCIAiCoCKk2vIsvGCOw01d58L9Yn5WX0pYmj8P7iXzHVz2jXg53cddPU/soAZBEARBEARBEFSFdH1mjgX2xs1I18I9Wu6QNEsn83+Pd/DYCPh+8f033T1JBKhBEARBEARBEARBp0iaGTgYGGxmt5nZ08B2wALANg3mrwMMxI1NHzeze/HAdntJi3b1XBGgBkEQBEEQBEEQVIS2Jv6bDFYBZsc7YwBgZh/ibScHNJjfH3jXzJ4rjT2Ad+zo39UTRQ1qEARBEARBEARBRWim766krwBfaXBopJmNLN1euPg+vG7eCKBRk9yF6+ea2eeS/tfJ/AlEgBoEU5FZZkxWxx4EQRAEQZAdo5+4MLWEytPk68vBuPFRPccXx2rMVnwfUzdvDNCoBnW2BnO7mj+BCFCDIAiCIAiCIAimT84FrmgwPrLu9uji+8zA56XxmYFGrryji2P1dDZ/AhGgBkEQBEEQBEEQTIcUabz1wWgj3ii+LwRYaXwh4NlO5i9UHpA0E/BVJk0T7kCYJAVBEARBEARBEARd8RTwIe7MC4CkOYDVgPsazL8fWECSSmM1M6UHunqitvb29ilSGgRBEARBEARBEEzbSDoZ+CmwG/Bf4DS8z+kKwHhgXmCUmY2W1IYHorMV95kVuAx4wMx27ep5Ygc1CIIgCIIgCIIg6I5jgd8ClwAPA23Apmb2Oe7M+xawLYCZtQM/AF4B/g78AfgbsHd3TxI7qEEQBEEQBEEQBEEWxA5qEARBEARBEARBkAURoAZBEARBEARBEARZEAFqEARBEARBEARBkAURoAZBMN0haW5JfVLrCIIgCIIgCDoSJklBEEw3SDoUOAiYrxgaBpxgZpenU9U1kuYCPjKzcam1BM1FUj/g+8BnwO1m1mXj8iAIglYgaX5gJtyhdQJmNiyNomB6IwLUIAimKpIWMLO3M9BxOHA0cB7wT2AGoD/em+sXZnZ+QnlI6g/sD+xvZm9Jmg+3ZF8HGA2camYnp9QYNA9Ja+N2+7MVQx8B25jZnelUBa1E0g7A74v2DOXx2YA9Ur8nBdMfktYBrgSWrDvUBrSb2QytV9U5xQLuzsBywDHAGsDTZvZmUmHBFDNjagFBEFQfSeOBBczsvbrxRYHngNmTCOvIfsCeZnZtaexmSc/hfb2SXQxKWg+4G3iKiaUXv8U/bA8GPgDOkDTMzK5Oo3Iikmas39GVtCQwLKedXkkrAp+Z2UuptTTgBPz//Kd4c/PzgXOA5VOK6o7itXoQsCywCbAd8KyZ3ZZUWAlJA8zs/gbj8wO/MbPvJZDViKvxRYr36saXAc4g4XtSPZLazKy9OIcbAI+Z2cupdZWpwmsTJixGrkPjHcoTkoiayJn45802wKjEWrpE0iL4YvMsQF9c+17AepI2MLNnUuoLpowIUIMgcyQtAJxM5x9o9SudrdK1LX4RAK7pfEmj66YtAXzcUmGd8xXg3w3GHwTmbbGWeo4ALjezvWBC6ucWwMVmdm4xNgPwM/yiNhmStgIukLSFmT1VOnQBsKqkQWZ2RyJ5AEhaGPgLsGJx+wngR2b2akpddawOrGtmbwFIOgh4Q1JfM/sorbTGSFoXb7Z+J77D0hvoB5wqaRszuymlvhJ/lrSxmf2jNlDsVl6AZyMkQ9LP8eAT/H3zTUn102YA/lE/mAJJKwE3AYMkPQU8AiwOfC5pMzO7O6W+GlV5bUo6Gl+c+gj4sO5we3EsJSsD/c3sicQ6esJZ+Of3TsD7xdgOwPX439h3EukKmkAEqEGQPxcDA4DfkdeK5iPAPkwMmJcAxpaOt+Mfwru2Vlan3ATsDRxYNz4I+HPr5XRgLeBbpdvfws9f+aLqn3h6cjKK9K8b8eDv/+oODwZ+AfxJ0jpm1mgxoFWcDsyKX7iMB44CfgN8O6Gmevoy8aIKMxsh6XNgbvzvJkdOxmu2T5L0EYCZHVD8fDQdX68puRD4q6SN8Drz3wBbAUOAQ1IKA34FfIpnSlyEvzbLgUrtffOvrZfWkLOAF4qvHYE+wEL4YtlJeBZADlTltflj4DQzOzK1kE54i+rEBusDm5jZ57VFHjP7VNKRwH1JlQVTTFVehEEwPdMf2NHMcrlgASaYJQwAkHQP8AMz+yCtqo5Iuqp0sw+wg6T1gYfxwGVVYG3gsgTyysyOp1XV6I8H+w+VxkZTt3uegCOBq81s9/oDZvYo8ANJ1+O1QCnTKDfE6zkfApD0AvCYpJnNbExCXWV64cFImXH47lmurAr8pMH4ZUy68JMMMztS0jg8fXYcMBL4lpndk1YZmNlY4BIASWOBoRm9JhuxFrCmmb0raVPgr2b2tqQrSB/sl6nEaxNYmPSfN11xInCupJ8BLwIdXptm9kUSVY3pQ+OMiF5EfFN54j8wCPJnPPDf1CK6wsw2AJC0LLAS/qH2HzN7JakwWKTudq0urVbnNx5PEVq6ZYoaMxxYChgmqQ1PnX7EzMofvv3x3aCUrA5s2s2cc4Hft0BLV8wLlF97tVqk+YA3Wi9nmmEMnipfz+JktutrZscWQeqxwOZm9s/UmuoxsyGS1pH0opn9ryib2BlfmDrNzHJwsRyPp/P2xnes9ivG+wKfJFM1KVV5bT6IewtkVb9b4nh8h/zxTo7ntIB2P7Avbi4I0C5pJvxv/oFkqoKmEAFqEOTPlcChkvYys/GpxTSi+FC4Bm+ZUdvla5d0E7BDvUtlq6gFzhXgj8Dpkn4KbIavsg+uHZS0RHH7+hTiSsxO92nmbwFztkBLV8wATFjpL8xdxuB1aTlxmKRPS7d7AwdK6pCJYGbHtlZWp9yM1/RtW9xul7QCnnp+azpZIGkSU6SCscBfCjM0AMxsQGtUdY2kPfESjo0lvYPXl9+PG6PNhAcLqXkET93/H542f1tR430KmdTJFmT72qzjBuBXktak8Q5l6t3VwYmff3I4DLivyIqaGTcWFP45lcXfePDliQA1CPJnAeBHwFaSXmXSD7Qc3ohPwk2ctsFrP3oBA/HdtKPxFc3klCzpl8U15WJJfyLwTeDR4vYfKdLAJB2L16m9AJyaRN1EXgFWoesd/VXxHeGgNKq4eQAAIABJREFUa4YBW9eNvQVsXjfWTiZ/P8CheG3ku/hC1NN4m5wn8IvFlLzKpCnT0HEnPTcOBH5uZndLOhl4zsw2KlJpLyKPAPUAPKhaHDig2Om9EM9C2aSrO7aYnF+bZS4pvh/Q4Fg7idN/zezKlM8/OZjZs5JWxp3Q38CvO64BLjKz15OKC6aYCFCDIH/GA9d2Oyst2wN7m9ktpbEbixS7s8ngAruBJf1ZTLSk39DMnk6lrXBtXV/S8sB4M3uhdPhpfEflMjP7tOEDtI4bgMGS/mZmk7gzS+oDHAfcMsk9W896kkaWbvcC1pa0eHmSmf29paomPu/i3U7KDDMbhZ/DjfCFil54+vQdqWvTzGzXlM//JVmCiX8r32aiMdJzwIJJFNVRtGhatW74JDxYzSajp/Ta/BauN5vXZhkz69X9rLRI2hxfWF4R+Bx4FjjdzHLaia7xP+DXtUXm4r2pvm1TUEEiQA2CzDGzQak19IC5gf80GH+aTC606NqS/nQysKQ3s2cbjN2cQksnnI07eT4p6Vw8/e8DYB7cbOoAfEHl9GQKJ9KoDra+RU87iWqqJP0dNxYb2e3kTChaZFxhZncBd6XWU0bShj2dm2pRogHvAgsU7s2r4SZk4HX876QSVZzL+81sXFfnVVJO5xJJq+F9j88qbh8LjMD7S2dFya/hM7xXaxY7/ZK2xB2P/4IvLNeyoW4uWotl01NW0tfxtkLXMdGw61pglKRNcjmnwZcjAtQgyBxJu3RyqB1f3RwO/CPxavaLeIB3Yd34ZnjqXQ5kbUkvaW58J3qomY0q+p4ej/dDfRc4ycyS6jSz0UWT+YuBc/CLlxrj8B3WQ8ysvgVNq1ki8fP3hIF4nWGV+DG+g343nop4U6r68gbchb8ndud0nWxRogE34IsmnwJvAvdI2gbv15oy1fIuvLTkXbpeiMjmXBaB1e/xcoma+/mGwC8kbZ5Rv9aZ8ZZxPygNJ/drKHEscKqZHV0aO7NIQT8ayCZAxT+DHsF39Gssif/tnI23lgoqSgSoQZA/x+AX3L2YaFAzJx0vxkzSt80sVe3fOcBvJX2Nie55A/DakP06vVdrydaSXtJieOubr+IrwqOA04CDgD/hu5S3F6nISY1JzOx94EeS5sPTPOfGU6oeNbP6xvNJiPqjqYOZLS1pPWAXvLfoxZKuxdPPU/a9hWosStRzOF53vDhwgZmNl7QofoGdsk/mEkxMk1yGjv2tc2UwMNjMTqkNmNlAScfghk7fTCWsjhNxv4Yfkqdfw/L4Qmk9VwI/b7GW7lgLWL2chWJmH0k6Cv88DSpMBKhBkD8XAYPw1dX/AMi3AK8GLsfdCy8FzsBTVluOmV1V7AAejqd5tuMpaoeb2W9TaGpAzpb0x+BtB1Ywsw8kzYFrvd3Mvg8g6TX8AqbeRCcJZvYuHkxni6QN8L+JlfFFnZF4+4SrzOyRlNoKeknqtiYtsxq6B4EHJe2P71D8AHfSfBU3gLmyqKluta7KLUoUWS+/rBv7ZSfTW0bdufwDsIuZZZcmW4do7NXwO+CIFmvpitz9Gt4F+gEv1Y33AybxHUjMGLylWL3WOWhsmBZUiAhQgyB/DgK2rQWnAGZmxQXijWZ2cVEbljRYMLNz8Qbf8+E7p+/jbrS5kLMl/cbATmZWay+yAa6xnOZ3O42dH1uGpBN6Ojdla5Qi6LsU2BV3d3wGT0OfE9gS2FPSEDPbM5XGgp66R2eRRlnHvHg63VK48dg7wM+A4yXtZGa3pxJW1Pd2ipn1uF51alOk9B6KO4uvjBu3vZLRwt5C5NXvtDPewet46x3GVwRSlxyUyd2v4U/AhZJ2qC1KSFoFOL84lhN/Ac6XtKOZGYCkpfHd6L92ec8geyJADYL8+QqNG41/in/YgaeAztoyRQWS9gF2L25eghsOPcLEdLtTJA00sydara2ewpJ+JfwiOjdL+vnpeGE1AF8Bvqc09g7eNiElO/dwXurWKPvjKXTbmdkN9QeLoOBSSf9I3HfwQLrvK5sNhUvzD/EU3/Xx+vfLge+b2bBizrn44k+/VDqZNPDvjQfSy+F9MbOgcEu9GrgCD6Ta8GDwIklfmNmQhPJqnAZcKelMPMujg5O4meXiMXA5nnL+VdytHbyN2PH4+c2F3P0ajsVTkB+X9An+Xj47+bXrATdGugt4TtLHuNa+wGP4wn5QYSJADYL8eQA3Kdi+tsNW9PM8jYl1Fj8ErJWiJB2Op5wOxWs7B+M7Vm/iAdYMwBC8lmqbVmorafwRcFfNtMfMRuCac+P/gPnwwBngW8B/zOx/pTnL4+lXyTCzqtT57Qr8olFwCmBmNxZth3Yjbd/B64pU6arwDr6w8yf8IvsuM6tPpXuASfu7thQza7iQIukkYK4Wy+mKo3FTsQsl7QhgZicWF9sH4e+fqTmz+P5HOqZNtpGRSRJeZzo/vgDRG9c3Ft/5S502WyZrv4aixGQNvMftisXw08CdOZUaFIwEVgc2AlbATSOfL1zGg4oTAWoQ5M++wN+B4ZJewj94l8KDlU2Lpu6nAtu2WNfuwG5mdiNAYZbyT9wpt9aT7Eg8DScV1wHjJT0O3IGnQT+SU/++grvx3bSdij5+K+Er/wBImhH4BRm4DVeEpYG/dTPnNrxmOhVVrJE6EneZ7ipl8mYz+0OrBE0mQ4B/A/ukFlKwAo1dUW8GTm6xls7YILWAHrKsme0r6Qi8dONz4GUza2SMl4wGfg2Q2K9BUq9a8Fmqib+j+Go4LxMex+ujJ9EaVJ8IUIMgc8zsVUnLAdvhDchrZgrXFi1TPsPNdVq6gwosCvyrpPNRSWOBYaU5b5B2x6If7pA4AN/FPRr4UNI9FAFrJilqg4GHJI3C3YZfwVfakbQdbqK0MBPTqZMiaS08jXZdvBbxf3hrh/MzMR+ale5TZ0firsmp6K4dShZImqnW+sLMzu9kTm9gAzO7M8PFnzLLk9d5H4W/R9W/B61AJnWT5dZWhb/AGDPLMS39Lklbmdm/8EWIbKnza6gZzqVkrKQFCx3j6HrxLJcdc6hOfXTwJYgANQgqQLEKfHnxVX8sVf3kTEzatuVzOrYkaKdjr8yWUqT0XlN81S6w1mdiStUFhTvuHWa2byKZmNnLklbEg+jxeOpnrWXLosDzuFFWvVthy5F0MHA6flF9Ox6czoWf1wck/cLMzuziIVpFdzuUqXcwB1GN+tPRpYtXACSdDxxftBwCr4W/nUwuXiVd1WB4Djx1/vctltMV1wLnSBpEUetXZMRcgNfzZ4GkffHd8/mL2yOA082svo4yJZ8BOe3uTUDSbsDvzGxM8XP98Qk/J6qJ342J70WDEjz/l6Uq9dHBlyAC1CDIEEnDgFXN7H1Jb9DFxbSZLdo6ZdWmuMi+UdJDuJnTBvjO9E/xVOrU2n7VYPyM2s+S+qZo4VF6/oH4RcG+ZvbrBscHAb+W9K/yzksiFpM0exfH522ZksZchgd1qXdPuqPRjuOuuFPm+93MS8Uidbfb8cWzM/Hsk1w4Cl88e7K4/QR+Hm8rjiVH0u54K5zf0LFv51mSPjSzRosBKbgK+KukoTQOVlLWml8K/Bn/W7+0i3ntJKiJN7OyW3w7cL2ZjSnPKQzS9mqpsO6pSn108CWIADUI8mQIE3cnh5B+t6czDpNUvhDoDRwoqdYupU8CTZMgaWb8ouo7wKZ4jeK7uAPgz0jcokfSEGAfM/usiznr4IZUS7ZM2KQcCFzQKDgFMLPLix69B5K+XvYf3RyvXcSkIqeAbnJppD2b9ygzq0TdZBEEbF38zayKB3/PmNkzaZV14CDgMDMrux/fKOnl4lguAeoxxff9GxxLEvjVMLNejX7OlMvxhbP36saXw42oclrgqcTfefDliAA1CDLEzI4v/Tw4oZSuGMakbp1vAZs3mJcESfvhQen6+Grqw/gH8J05tL4psQnwqKRtzOyF8gFJbfjF1zHAC43u3ELWBI7rZs7v6N6gaGpTlQuXbIK6oDUUPVp/YGYja2OFf0CrPQR6ypL47l89t+IBSxZUIPADGv//F+Pz4p9LqybQdCBwVnGzDXi7nHZc4uFGg6moUH108CWIADUIKoCk/nhvspnouHvRbmYnptBkZouneN7J5Dw8QN4XT1v6tJv5qVgFD+wek7RPLeVK0qLF+Lp437zUfei+Qse0zkaMwvvmJSOD9OKe8qvC5KxLzGyXVoipMpK+oIcBv5mlTP0biL+PV4U3ga/jxm1llqf794KWI2lZ3AX9M+BZM6vX3XIkrQt8rbg5EHdr/7Bu2tdLc1rNBfj7di+8n/khQFlfO96LPWmmUSMqUh8dfAkiQA2CzJF0NHAC/gFR/6HWDiQJUCvCb4GN8bqf/ST9Ffgr8LCZjUuqrISZ/a8wRzkGuFTSBnjrmfPxVO/vFFb6qXkdWI2J/VobsSrw39bIaYykzgK6sbg76r/resymYmG8NjKYcvZk0jq0C/B2TfXpikHPuQa4qGg/Uu7beQFu8pQFRRnH74AflIbbJd0E7FBzok7IFcX3dvx9vZ7RJNqRLj4LLwMonPivK9egSpqjZNqXDRWqjw6+BG3t7ZFhFAQ5U/Q+vdHMjkytpaoUq+qbFl8D8EDlHjxYvcPMkgZUZYo+qDVH1PuAH3bTd7JlSDoVT0deq9EFn6TZ8HYzf0y1s1/o6M7N8wvgQjP7eSv0NKLQuEAGLSa6pNB5Nh1NZw7DF3/KteY/T7wzOQmSPgJWzsnNszifC9EDc6wcek5KmgXvJ70lExcA2oBbgO3qzXRSIekMYCc8W6YcrJwLDDGzY9Opm9BftBe+INUP731aoz2H/2sASXPiZTDPmNlxxdhb+Dnd3cyyaesi6Vngkrr66FrK8o/NbJU0yoJmEDuoQZA/C5PQ4GFaoKjrfAHvPTcLfuGyCe5KeIGkV8xs2YQSAZC0JnARnp72FLA2bvv/y5S6SpwO/Ajv2XoiXpP0PjAnHvifgH+upDbS6N3JeC9gHrwm+TxJLydMBavK6nD2teYV5M0ezkse8BfGbd8renGvhL9un66vlc+A7YG9zeyW0tiNkmp9w5MGqEUA+gUJ2671kLOBZXC39ho/xvtyn0pjE6pUVKI+OvhyRIAaBPnzILAGbp0fTDmzAzMDY/AdoDEkrpksjJCOLr6eAL5rZq9IOhw4VdLGwM6pd9vMbKSk9XHnzpuZNKXyr2Swym5m4zs5NB54G7i+aJuwP17bm4JKuPhWpNa8ahxIxj1wi92+ejoYOdXm5LLzh/fi/U+D8aeBBVuspVMkzQrsDazIxAWINvwzaQ0zWyKVtoLNgS3M7F+1ATO7U9KewI3kFaBWqj46mDwiQA2C/LkBN1NZE3gRD6gmkLi/W/ZIWgY3GVqv+L408DGesnQz3tPzuXQKAV+E+Ca+an1cLcAys9Ml3Y+n2D0jaVczuz2hTsxsOLChpBVx46658YuBB8zs+ZTaJpOHcROtVAwi4yAlmKpcl3qxqRvG0fMd/uS7vAUv4o7t9QtOmwHZpHjjtbs7AY8Ba+HvQ0vhJj/nJNRVY1b887Ge/8MzZXKiEvXRwZcjAtQgyJ9Liu8HNDiWtL9b7kh6Dw+gxgH/xD/Q7gL+2cUuWwoWBgaa2YP1B8zsEUmr4CYbfyaTC8KiV2NO/Ronl7H4jmoSak7NVULSAsDJNHYUx8xS9ujtjNxSqXPT04jdqIbOMucAv5X0NToGKz8F9kumalK2AAaZ2bVFL9ndgdeA68nD3fkR4BeSBtWMBIsA8GDgX13es/Wcgqed38Sk9dFHpxIVNIcIUIMgc6rS3y1TrsYD0vtSp512w8pd9W8zsw+ArSQlM/UBkNTjOi4zO2FqamkCm5Cw92SF2qKUuRi/6P8dme3+FpkG9cyKp3N3aOVjZgNao6oh2ad2m9kVtZ8lbQPcbmaNdtWywcyukjQ3cDgTF3PfAQ43s9+mUzYJc+FGcgDPAqub2UuSTsGzpVKn0B6BZxe9KunxYmxVvMXYxslUFRSfgUPM7KNSfXSttRDkWR8dfAkiQA2CiiBpJWA5fBftq2b2emJJ2WNmBzUal3QRcGwmrUboLDit12lm57ZU2KT8pMHYgrgjaXk3sh03TEqCpM528nrhF1oDgMF4LWAqqtgWpT+wo5n9NbWQBjTqd5m8B2Y9FVxw/C0ws6S/4ztVt5rZO93cJwnF++O5kuYrbueYRv0uMB9uKvYyXot6LfA/YIGEugAwsyeKa429gBVw1+Grcdfzt5OKc07Ba2E/kjQed0KvmSAG0xDRZiYIMqcwVbgJX71sx2soz8ZrVjbLpQVJlSiapK+SU/uJRlRBZ8atPDr7cGvDd//OMLNTW6eqe3I8l2UkvQMMMLNkO89VR1Jv4Cy8DvEzPLXzKDMbnVRYJ0iaEV/Q2Qw30FkK+Adev3+zmb2UUNslwEG57+6WKTSvhtegfw3vifojYFvcHE8J5WWPpOHAnfgu7+X4jnPDHq3RB7XaxA5qEOTP8fgu1Zp4706Ak4CheNuPRrtaQddkn2ZXUBWdubFBJ+NjcbOPFzNyH60SVwKHStorsxruTsktWwLPLNgDf/8ej9cg9iXT9/GiDvHvxdfBkpYGfoG3HDmNtDXxu+O1hhMCVEkPAtuaWU9b+bSaQ/G/o/7Ar/Ea2Yfx96YfJ9Q1AUnb4zqXxXdR9wZeNbOLkwpzjsF72+6KL0Ke38m8dtxtPqgoEaAGQf5sDexhZo9Jvrha/LwX7u4aBEEJM7svtYZplAXw3Z6tJL3KpI7iKWs7O2MnfMcylwD1h7hJzg0Akm7F+3XuaWZZprQVxkMbABviPaTnB57E6/tT0mgBb2W8ZUuufBPYvrZjLuk7wCrA22b2VlJlrmdLYAhuvrhcMfwB3jd6vJld0umdW4CZXQ5cLmkGPKjvh9caB9MYEaAGQf4sBPy3wfgIvJ4umHxOwXfScqcqOitBFVKmM2c81WvfkFsWwiL4jlmNu3AzpwXx9/SskDQM/wx6HnfH3R/4e5SWfGmuATbCA3yKRYknkirqyFHAIWZ2kaQfA5jZKZI+xs2nkgaoNcxsvKQlgLfMrF3S/MB7kRkz7RABahDkz7N4/Wn9B8OONG5MHnRDbrWHnVEVnRUit2ClEVnuogGY2aDUGqYBZsKNZwAws7GSPiXfXb9h+M75DHi7rqTtmaYB3sJNknJleaCRCdqteEp3NpjZ65KOkHQo3qN1mcJp/h0zOzyxvGAKiQA1CPLnBLxVwgr43+zu8lzf7wHbJFUWTFdI2rDBcC9gbUmLlwfN7O8tETV5ZBP8VagtSgckLQX8DK9P2x34Nt7a4cmkwjqnKlkIWS6emNl6kvri6b0bA2cCSxQtSO42syOTCmz8N53N33kD7gBukXQn8BLwafmgmfW4lddUYiS+y1+fZbIi8H7r5XSOpN2BQ/B66OOL4QfwdORRZnZKMnHBFBMBahBkjpn9SdLWuDHFeLw1xtPAD83s5qTigumNu/CLv/qL6avrbreT1jylM3IKAirRFqWMpOVxB9fXAOEB9SbAryVtamaNgu7UnAmsKOk9MxueWgz+t9FLUq3dTFuDMQBySVc0s4+AW/DAaiV8YWJPYHUgdYD6q7oFnZmBXxYpqRMws11aK6tTtgbexvt2rlR3rB1IHaBeg7fq2b3QM6ekzYELyc/zYn9gfzO7RtJxAGY2pHg9HI8vTgUVJQLUIKgAZnYbcJukrwDb47tW/0yrKpgOWSK1gCnk60AW7p4VTZc9E7jCzPYrWuJgZjtKGgKcjDuTJqNwHz0I2NrMhhWOs38FFgfaJV0O7JU48Gtj0tdgG9CodU/yRR5J8+C75JvgO6jzA//CM3tuSSgN4H5g3rqxh4C5iq/sMLNO30ML45/UHA0sBjxW3H4Mf33+qTiWE0vTsZ67xsPAwi3WEjSZCFCDIFMk7YOvVIPXn16Pf1jUPuBOkTTQzHIyWKgEVTFUyE2nmb3eaFxSP2BELjprFA6Z95vZJwBm9oakH0v6PzO7NbG8hmTYFqXMmsDBDcbPAB5tsZYOFO6jQ/Ge0bWeokPwAGZr3In0UmBfOm9N0QqqtjDxLn4+78Z39241s3fTSnLMbGBqDZNL4X69er3JlKQF8cyo+oC7pZjZ58C2ko7C3YV7Ac+Y2fMpdXXCW/ii42t14+uRyUJk8OWJADUIMkTS4fhq5VD84mAw3vfrTbxp+gz4xdeRRB1qj5F0BN7fLWtDharoLPEcfjGThTtusRNxLR6YfBvv4VhjK7xNylC83UdWQTX5tUUpMwONrxvmws1zUnIAcIqZHQNQ7J6uB5xZK4WQdDReKpEyQP0v8HDRX7QKfA/4m5l91u3MDChSkJcD/gx8tbNFtVYi6bt4OjT4bv4R9SnIwDJksGNew8xeBl5OraMbLsFTvA/Gd3mXL871CXi2R1BhIkANgjzZHdjNzG4EkHQtntK7Sa0BuaQjgb+kk1gtqmKoUBWddeRU2wlu4rMx8IN6syYz+4GkrfAm7g+RSduEErmdyzJ3AkdJ2rG43S7pq8DppO+JuRqwX+n2hngNXXmn/Ak8LTAl9+AtZbLYhewOM7tV0mqSDsNrJsfgzvJnm9njadVNRNKs+O75xvj/+9LA2UUWymaJ2+K8DvyaifXGOwLlhbF24CMaZydMdYpWQqua2fuS3qBrk6nPcWfnwRnUnJ8BzA38Dq89vgVfKLsYf08KKkwEqEGQJ4vidT4AmNmjksbiHww13iDTOptMqYqhQlV0lsnNNXN3vJdfwxo5M7tF0mDc6CW3ADVnDgLuw4OrWYHb8Peq94CdE+oCmIWOjqj98eyT+lr91DuXOS9ATIKkdfH03heK773wc/uwpPXNLBcvhOPxwH9NfBEA4CQ8C+l04CeJdGFmz+J/J0j6L7BGZin8Q+iYFt/V+/mMwDrAZcBSU1lXlxQ9ZA+XdAK+a94LeMHMPqw3HAuqRwSoQZAnMzHxA6PG53RMo2vH35CDnlEVQ4Wq6CyT20X31+iY1tuI2/DU+dzIti2Kmb1ZpFDuQKk+DfidmX2YVJynl68IvCZpRnwn7X4zK79nbkwmaegV4hTgajObEOBJagN+ixtjbZRKWB1bA3uY2WPehQ2Kn/ciI/fZrkySUmFmx5d+HtzdfEnfYOIiQDLq6nkfK41nUc8bTBkRoAZBML1QFUOFquicgJn1Ta2hjtHAbN3MmYH0dZNImrFcj2hmp0paUtLHOdYpmtmnuNlQblyDp3TOBGwKfBXfDQIm7AQeC5yTRl4HDpP0aXeTMuiJCbAGsHd5wMzaJZ2NtxzKhYXw+t56RgBfabGWDnTS87ghOfQ8ltQf3yWdiY6Lj+1mdqKZ/VvSsom09bSeNxbvK04EqEGQL/UXMb2BAyV9UNzuk0BTlamKoULWOovdqU2Ae4pgBUl7AFvgqZ9nZ+D4+BiwOfCfLuZsCSTVWdTCXiBpCzN7qnToAmBVSYPM7I5E8gCQdFlP55rZblNTSzecifdmvQGv7zvbzP4AIOlcPHX+buDsZAon8iO8p3VX5NATE2AkMHuD8Tno/ndoJc/iO+T1Kfs70vX7QCt4lfzKIBpSGImdgNfE1mdFtAMnApjZiBZLq9HTet5DWi8taCYRoAZBngzDU5bKvIVfdNfPC3pGV4YKpyXUVU+2OgtDnHvwHd4VgOclHVroehLoCzwiae3EQepFwHWSni56CHdA0mbAMcBeLVc2UcM6wI240Vl9Su9g3G32T5LWMbN/t1hembKpUC9gbbzm9En8dbkysADumpqMoj3GLkV7rnYzK++q/BE3cfpLUbeWmtVzadXSA+4Cfilp65rmwnjoTOBvSZV15ATgekkr4Ne2u8tzfb9HYqd7M9s15fNPJj8GTjOzI1MLaUQF6nmDJtHW3p7De3UQBEFrkNSHOkOFxJIakqNOSefgNWfbm9l/JM0CvIPX+wwoUv/OA+Y3s+0Saz0DX0V/Aq/f/QCYBw+wVgYuMrP9On+Eqa7vz3jroN27mHM9MLOZfa91yjpH0inAksCutbYjxY76JcBYM0sW8HeGpPmAMWY2KrUWAEnjgQWrEqAWPY4fxlOma21HlsKzJfqb2RuptNVTZJr8AliVifXRp9baDCXUtRtepz2m+Lkz2s3s8lbpakSRtbVS0WYmCJIRO6hBEEw3SNofGGlmVxW375B0k5n9OrG0DmSsc0vgZ2ZWS5kbiO+a/ra0M3U93u4hKWZ2mKR7gZ/i2Qhz4zt/DwOHmtndCeWB11Ft2s2cc4Hft0BLT9kbWKfcE9PMxkk6HXiUhDvS9UjaF+8TPX9xewRwupldmFRYfoZiXWJmwyUtj/fnXbEYvggPuD5Kp6wjkhYFbq/PmJA0g6Q1zexfndy1FVyKZxi8S9f12+1A0gAVeBCvO84+QJXUpRGemW3YKi1B84kANQiC6QJJR+AXrGXDj0eBMyX1NrML0ijrSOY6F6Zj3WZ//KKqfKEwHJizlaI6o7hYnSTFNxNmB7rb1XuLTM5lwefAYkxau/t1oN6oJBlFL+FfAr/B2+L0whdTzpL0YW3hJxHHk9G56glFIHpxah3d8F881fy9uvFFgHvp3jRtarINRT2nmeVu3nMD7oGwJvAi3vd2AmbW45r0FjCCjrW9vfHd/eWA85IoCppGBKhBEEwv7AnsUk73MrOjJT2Jt1LIIkAlb50f0zFg2hB4xcyGl8aWJNM2KZnxCt6qpZHzaI1V8YA/F64BLpN0LG5E1Ya7fR6H76rlwkHAYWZWvki9UdLLxbGUAeqPgQvp2LM1K6riOluky+5U3GwDbpL0ed20hfEyhJRciRt4vVm0RlnDzN5PrKkzaiZTBzQ41o73P80CM9up0bikk4ge8ZUnAtQgCKYXFsBrkup5HF9lz4WcdT4IDAIOKvphrsmkrqgH0LiPa8uQ9AY9dM00s0WnspzOuAEYLOlvdYY+wIQa5ONwk6xcOBzfiboQ361oAz7DF0344EMRAAAgAElEQVROSKirniVpbNp0K77Ik5LF8RZHOfNKagE95BZ8Z7yWNv0W/nqs0Y7v9qduizQa+Kmku/D///VKbvwdMLMeLw5MDSqww9sThgD/BvZJLST48kSAGgTB9MILwPeBs+rGtySvC7KcdZ4E3CdpYzxYfh9PpUTSt4FDgQF4z9aUDCH/tg5n4y0SnizaoDxCRyOnA/A2HqcnU1hH4ZS7V9ECScXw87V2QxnxJp52XP/3sjz+mg26wMwGpdbQE4pdyF0AJI0DDsjBTK4B5+DvnUfh70ud1ei3k//iRRVYnorVegeTEgFqEATTC6cD10j6BvDPYmwNvD5oj2SqJiVbnWb2WFGbtCsePP3GzN4uDm+EGxFtZmaPJZIIgJkNTvn8PcHMRkvqj9f2nUPHxvLj8B3WQ8wsabq0pCU7OVTbAVrAu3mAmb3aElHdcw1wkaRewAPF2AB8p/faZKomspikRr1FO5D6fBbmSC8VCxNI2gjvd/wOboxWX++ZjJyDajM7RdKv8bTTl/AFqGxao0jqccq7me0yNbVMDp3ongP4FnmZywVfgmgzEwTBdIOkH+I1aCvihi/P420I/pJUWB1V0VkFJPXFHXPnxS8K/51Ly5EaRSuUVZjoNPxoLjtBkr6g+93oNrxFRha7P0X7o+vwrIOa9jY8JXQ7MxvT2X1boC378ylpNnyXbyNgeTN7QdIuuMPs23ga7czAWnX158no7rxm9NpcH3jIzMal1lJD0j09nWtmG0xNLZNDA93t+Oflw8DZjUonguoQO6hBEEwXFIYafzKzrFdWK6RzGWBdJgZ+D5rZi2lVTaS4yD4L3+2dpXToM0lXAgfnkppa9MS8M7WOTsjmgnQyGI87YZ+BB1nPA8+Y2QtJVU3kh+RtJHY47oS6FfBy0ev2TOBZ4Jt4gHoNMJh8sk/2ZFJH16WBnfF+yLnwALCjpHWAmahLRTWzrvqkThVyCjonk1OBB8xsdGohQfOJADUIgumFX+Irq9mkVnVC1jolLYjXeG5Cx4urdkl3AruZ2VtJxBVI6g3cBSwDnAzcjZ/PufCA60BgZUkDUu1kSOqxqZCZHTs1tXTz3Pc1Gi92fcfktBstaSH8onVrYNbSoU+AayUdUywGpOahTHR0xjbAgWb2Z5iw6zcvcGwtGJD0G2BoOokdMbOGRkiSHsdrvVM6N5c5B9gXD/br/3YipXHyuAZfgHoytZCg+USAGgTB9MLzeC1nLrsonZGtziJd9u94veQuTBr4HQvcI2n1xOlV+wL9gJXMbETdsUclXY0vAuwLnNtqcQU793BeO35es0DSvvju5PzF7RHA6WZ2YWJdCwP/wBdNzgGeAkbibZFWx1+vm0r6ZqluOmjMErgLao0B+Ovw7tLYq3jQmjsPMrF1Sg58Dw/+z08tZBrgLWC+1CKCqUMEqEEQTC88C1wu6RDcqKJDemdG5g856zwQT59coy4AfQ+4QdJtwEN4/WzKtiM7A8c0CE4BMLO3JB0D/JxEAaqZLZHieacESbvjO/y/Ae7DFyoGAmdJ+tDMUu5SnYjXR37bzEbWHfuDpFPxxZWDcbfpVLyO/w3lzGd03IHeAHjTzF4ujS2ELwDkzg5MNPTKgbmB8BJoDncAtxSZO40+K7NZ2AsmnwhQgyCYXliKiY6e8xRfOZKzzm3xNL+Gu6Nm9rGk4/CWCikD1KXxnZOueBC4qAVapiUOAg4zs/NKYzdKerk4ljJA3RjYtUFwCoCZfSjpWDzAThagVmRh4jF8p+95SYvgbaOG1M3Zg467rEnppPdxX9zV9ajWK+qUO4BNgV+lFjINsDW+KLVS8VUmq8yTYPKJADUIgumCqhhBZK5zcf6/vTuP93wu/z/+ODS2SUqkLJl80/OL6MtXtDAkW339qm+jb8mSJdyK7EZkKTKKkCyhJCqKNJWtbBWFkCUjLgYZS5Ywxr6e3x/X+8x8zuesM2ber/fnnOf9dpvb+Lze7znnauac0+d6v67XdQ39pvTG6r6SXiWbpAxmIaBYN9cekj4A7EbvhlN/Ab4XEdeUjK0fKwAX9LN+PjCp5ljaLQkM1aRrCln6XUyVJA9LRJR6yHMkcKGkD5Nv/F8m5/YiaXXgy8B2wMcKxdef9jOoMzu6RsSVBeIZyHXAUdXc6KDtZ1BTd/2qkU1vbEp3ceiYhz02h5ygmtmoIWksWf65GvnGYApwTkQ8XTSwNg2O8wVyR2IwbwZKx3kzOa9xsHO8nwRuqiec/knam5x7ew9wMbPO864HXCVp/4g4qmCI7R4EVgbubltfBXi8/nB6GUN+fQ7mRWCRGmIZzI79rL0DeJTepb/dFKpCiIhLJX0c2JlZIzvuqi5vS37vbB8RTeo83Q2cHhH3lw5kCF8i58i+r/rVqsm7fhsBFwGNGNfTH0n/CcwfEbeVjsVePyeoZjYqSFqWLJ19OzCVPD/3JeAASeuU7jzbo+FxXkeW+f59kHu2AP5aTzgDOhk4VdKVEdEnlqor6YFkd88iJK0PfAvYNSJO7uf6dsDJkq4bqJNuAWcBJ1W7KT1l6OOB44Gzi0XVQSJiufY1SU8D60TEPQVC6ldEXEZ2wm63P7BHRDSt4+xewM9KBzEU7/q9fpL+i2x6BvBjsm/DeeRDSST9Ddis4Z2ybQhOUM1stPgO2fXvQz1JXtX581wyUfhCwdhaNTnOY4HzJd0YEee1X5S0FdlIaaPaI2sRET+XtAG5C3khWTL7ONnRdTz5RubEiPhtwTD3BI7vLzkFiIjTJam6rykJ6iRyV38ys877dQG/IRP+0iZKGmy27djaIhmBJJ1EnkFvxPzgNteQ43G+VTqQdpKGW2LcHRHrzdNgOpykzYBfkVUcz5MPb08H1iCT1vnJyoOvAbsXCtPmAieoZjZabAx8vHUHMiIerLrl/qZcWH00Ns6IuKSa33mupFvom/itSjbRuWqQD1OLiNhJ0p/J853fIneiu8kGMFtGxDkl4wPWAg4Z4p6fAZfWEMuwRMQLwKeqUrqepiR/j4gmjESaRjZNGc59Nme2Ih+gNXFG83PA4ZL2I5OX9o6u44tEldpL4m3OHQwcFhGHwcyHomeQP9N/Xq09SnYad4LawZygmtlo0UXfweiQoxJKn0tr1eg4I+LwlsTv02SX4cfJks9dmtTYpxp7cqakhciznU9ERPHGSJU3M/S5zaeAN9YQy+x6gUz0AZD0ptLNUyJiXMnPP0p0lQ5gEDMo20V6QBGxXekYRpCVyQclPc4md1Bbj53cQh6RsQ7mBNXMRosbyKTqS23ru9OgcQl0QJzVmcimlJ0Oqdr563V2tyqf3Tki9ioTFfeRZWmDNXVZHbi3nnAGJmlDchd6w2qMy630flhys6T3R8RrRQK0Uc9J4JyTNJzEful5HsjwLELLA9yIeFXSC/RukPYazm86nv8BzWy0OBj4g6S1mTUjc11gJbKstik6Is6qmdNqZHnvk8DNEfFw2ahmyzgy6S+VoE4GDpF0cUS81H5R0iLA14GipciS1iK7d/6S3h08tya7+i5Pzsj8HNlEyQZRnY1uNx/wQUnjWhcj4opaghq+ScATpYMYiqTFyGZt8wGTm9IAr8H6NO4aQFPG9TStQZfNA13d3f53NrPRoXqzvTd5VhKyLOjoiLi+XFR9NTlOSasCJwDr0Lvkr5vs+rl7Q84kDkrSJsBFEVFkbIKkN5M74k8Ah5HjPFrP8x5KPkReOyKeLRFjFecvgRkRsX3L2gzgv3q6zko6DXhHRHy8UJgdQ9Jr5PfKUOWy3aW+Ngci6Q3kz6THIuKB0vEASNoF2KF6eSrwC/L7aly19jSwfkQUHSllc0f1/bM5eeSlx/nATsyqknkLOZatUd8/Nnu8g2pmo0ZE9IxJabSmxilpJfKs6b3kG4JbyDcKiwFrkmXJ10paMyKmFgu0A0TE9GrczZnAr+m9K9AF/A7YoWRyWlmHnHvZqj25Op3srGlD64gxI5K2IKsLJkTENEkrkl+T44BuSaeTJfLFyrqrhkgHAj8lO7p+nZzT+gBZdTI/ubt/ANnh14YgaVHyZ/nbyIdn11dl/Uj6EPBcRNxcMETIao52P2l77d23DucE1cxGLEl3Ah+IiCda1haNiKcLhtVHp8RJ7ur9lZwx93Lbtb9J+iH5JnZfYOe6g+s01S7UBpLeC3yIloZTEXF70eBmeQv5hr/VofRu8DQNWLS2iDpYRNzX89+SPkPu4pd+CNGLpE+QSd9kMvGDTPSWJDslPwn8ENgV+F6JGCs7ANtHxLkAks4mfz5tEhEPVmsHABeWC7EzVEcKvkMm+Au1XHqlOqO6Dznv+DigZILaEQ947PVzgmpmI9m76ftz7kFJM8sTG6JT4lyX3FFpT06BmQ0rDiffvBYjaYVh3PaOeR7IMEXEFGBK+7qkscB/RMTf+/6p2jxKNkh5sGchIo5qu2c5oJPOHzfFD4AFJV1B7qL/NiIeKRwT5NnsSRFxEEC1e7oOcFRE/LpaOxDYn7IJ6juB63peRMT1kl6m9yih+8mHLDYASWPI4xnvAQ4HLidHCS0OfATYA/gU8BA5+qqY1gc8rSR9GLihQV3a7XVygmpmo02TRyW0amKcizP0HMmplO/4OJWhS7y6hnFPaeuQDYpKnqW6hmyANNj5563ooK7ODbIEed74f8gdqpMlXUsmq7+OiLsKxbUG8JWW1xuQ3yvnt6zdBKxYZ1D9WIBZO7w9XgJaH6B1k82SbGC7AssCq0XEQ23XrpP0J/KM/CkR8Wrt0Q3PxcB/AU16oGuvgxNUMzMbrjcAQz2hfhlYsIZYBvORwp9/JDkRuFTS3RFxUvtFSV8EtidLlG02RMQrwBXVr72rncr9gSPIsT6lHkwsBDzX8npdMhH8a9t9r9QWkc1LWwMH95Oc9tgDuBvYDPhabVHNniY+0LXXwQmqmZnNjqbvOvbMae2jGo3zkOd1Dl9E/Kk6x3ecpD3IZOoxcjd9fbIscO+IaMSM3k4j6T/IByobkH+fS5Fn/C4rGNY9ZLfef1adezcGrmwr7d+YZuxWTZTUmkyPAfaU9GT1emyBmDrNimTzu4G8TDbAm1xPOGZOUM1sZOumb0LV31ppnRInwInVYPSBLDTItdL+gcvAZltEfEfSlWQp4MfIDp+Pk3N6vxgR15SMr1NJmkaWw99OJgi7AVe0Nksr5CzgGEkLAJuSpcin9VyszvsdDBxbJryZppFNm1r9i9zpa7/PBvYCmdj3KyK2lvSf1X1NdR+9S7utwzlBNbORrAu4qZqd1mMs8GdJvc7SRMQ7a42st06J80qyk+dw7msil4HNoWr00Tal4xhhpgFvJ0t5XyHfYDfhjN9RgIBzgNeAYyLiPABJ3yUT6cuBY4pFCETEuJKffwS5mUzqB5tf/SlyrFgjRcR7S8dgc5cTVDMbyb5ROoBh6og4I2L9nv+uOj+uSM5AnQ7c2eAGGj0asyNd7UgOpbHdRyWdRJ5b+3fpWDpVRKxTzZ3cgCyZPQp4l6Qbgcsj4oBCcb0EbCNpF6A7Ip5pufwrsvz4wohozPdTK0lfBU7umd9pQzoJOEPS1RFxdftFSRuQZ0+LP6CSNOwYIuLMeRmLzVtd3d2N/PliZmYNJGlpsonLBGDhlkvPAmcDB0XEoyViG4qkp4H3NWF0j6TTh3tvRGw3L2OZE5JmAE0bg9TRJK1GzvbcCVggIkp2b+5D0tuAFyPiqdKxDMZfm7NP0gnk192FZOn+k+QDsvXJMu/vR8RuxQKstFUZ9eimb3VMd9O+f2z2eAfVzMyGRdIywLXkm4FjyZKv6eQu6prkE/ZNJa0dEY2bixkRi5aOoUcTk87Z5HLp10nSW4GNgE3IHdSlyLmehwK/KRhaL5J2BQ4g40PSQ8C3I+KEooENzF+bsykidpV0FTkD90hmjeG6Dvh8RJxbMr4W7Wdlu8hkeg3cW2BEcYJqZmbDdRjwMLBRP+Vz50k6gmpkBrBv3cG1qrqPbgL8ISKeq9a+CPw/4FHyXN3tBUPsl6QLycZD/yodi81zj5LjWy4nmw6d37TqA0k7AEcDp5Czbucjd9W+I2mGyyhHjoj4BfCL6mfnEsDjbZ2bi+vvGIkkgFc74IiJzQYnqGZmNlwbA9sOdLYrImZIOph8Q1ssQZW0BPAHYGXgvcDtkvYlZ0veDCwKXCPpgw1MUsfTu3S6qSYBpbvNdrpPAZdGRJO7o+4FTIyI41rWzpU0tbrWxAT1p8CM0kF0GklvAp6p5vM+LGklSZsCjwDnRcRQM7DN5pr5SgdgZmYdY0ngziHumQIsW0Msg+kZJv++iLhd0kLAgcDVwJoRsQFwBnBIqQBHgJ6GPqX/rTtWRJwPrCzp55L+IekmST+VtEbp2FqsAFzQz/r5ZKff4iStKmnFntcR8SU37xo+SfNLOpUcHfXuam1T4Cay38CpwPWSGtu0zUYeJ6hmNqpIWk3SZyWNlbR86XgG0tA4xzD0LLwXgUVqiGUwnwD2iYgp1ev1yV3TH7R0Hv0F8JECsXUcSVtIul7SO6vXKwIB3AD8U9IPJPn9xGyq5oleDfwnWeZ7NbAacLWktUvG1uJBshKh3SpkQlOMpGUk3UxWRdwh6QZJK5SMqUPtDnwG2BN4QFIX2dn3IWB5cu7xv8iHfGa1cImvmY0KkhYGJpNlqq8B7yGH0S8F/E9ENKJcsVPibLhlgNbS3XXJhh9XtKw9QDZ3apqdyZK6RpD0CbJkcjJ5XhLgNHI3fQLZoOSHwK7A90rE2MEmAT+JiB17Fqrk4AfA4cCGpQJrcRZwUvUA4qpqbTxwPNm1u6Rvk+XwW5HzY79GnpXdqGRQHWhrYI+IOANA0lrAOPIh3yPV2tHAyWR/gWIGeQCxXHUWdSZ3ce5sTlDNbLT4BvAOYC3yfCLAN8k3398Gdhzgz9Wt6XFOlPTcINfH1hbJwJ6hd/K5AXB3RDzQsrYCDTpDKWks8EpEnCVp5SoxvDoihjMvdV7aHZgUEQfBzN3TdYCjIuLX1dqBwP44QZ1d7we+1LoQEd2SjiG7ZTfBJHJXdzKz5gh3kV2GS++obQB8JiL+AiDpDuAGSQv6vORsWZEcLdNjffLf+pKWtTuBpWuMaSBT6TvPuoveDx97OhB7zEwHc4JqZqPFBLI76g09T1qr/94Z+HnRyHprcpzTyPiGc19Jfwa2A/aqZkuuBRzTds/uZEllcZLWI9/wf1rSbWS31DHAGyVtFREl/93XAL7S8noD8s3f+S1rN5Fvcm32TAfe2M/6m8gdwSZ4lRwxcyS5o3s7cGtE3FE0qrQkcHfL61ur398G3F9/OB3rNXonc+sB/245IgE5E/XZWqPqn49ljBJOUM1stFgauLef9YeAN9ccy2AaG2dEjCv5+WfDN4E/SdoYWI48K3c0gKSNyA7D48mdwCaYBPwKuJ4s8X2ebDS1PfBVyj6YWAho3TFfl4zvr233vVJbRCPHZcDRkib0jJepSvmPAi4tGZikpckGORPo3VX6WeBsSQc1YCTO/GRyBczcfX6RvrMybXC3krumd0panEwCf9l2zxbA32uOq4+I+FPpGKweTlDNbLS4jTzXeWrb+pZk59mm6JQ4G6vacV4L2JbcATolIh6uLm8ILE6e572hUIjtVge2joinq6T6ooh4UdJF9N35rds9wKpkM6Q3kF+bV7bNR9y4us9mzwHkLv4/q7EtkF1UHwU+XyooScuQJcZdwLHALeRu72LAmsA2wKaS1m75vrLOdTzwo6ra5INkgn8cgKTlyH/vParfixvGjOujG7LDb6+DE1QzGy0OJYeQv5f82beDsob2U2QHw6bolDgbLSJuo59ZrBGxX4FwhvIssEDVIGsdskkO5FnkfmfO1ugssknXAsCmwBJkkyRgZifag8lExmZDRDwgaRWyyc+q1fJJwM8i4ulykXEY8DCwUT8zj8+TdAR55m9vCs47rqwjqTXG+YAPShrXelNEXIH1KyJ+Xv3s+TLwMrB5RPyturwf8EXgm4WPGgDDnnF9bUNnXNts6Orubj9rbGY2Mkn6ONnMZXXyjcytwBE9zV6aolPi7ASS3gN8mDyv9m/gzxEx1CzXWkk6hyylnQ58mkxM/4PsSDo1IrYsGNsCZJfeLclyyuMiYp/q2neB3cgRKZu5Mc3IIOkBYNuIuGyQez5O7lStVF9kfWJ4bei7AOiOCDfMmQPVbvrzTekeL+lYsgpmi4iYUs24foQsPx5flXkfBywVEZ8rGau9Pt5BNbNRoZrheHFEXNS2Pr+ktSLiukKh9dIpcTadpHeQO32bkKWKPbolXQJsHxH/KhJcX7uQJd2rAltWpb5fIM91Fh3rEBEvAdtI2oV8o/9My+VfkecoL2yZL2uDkDTsrswRMX5exjKIJcmurYOZQp6TLuldhT//iBcRD5aOoc0ngC8PY8b15AKx2VzkBNXMRot7gbcDj7WtLwf8EVik7oAG0ClxNpakRckSxPnIc1OXk7unbyEbgBwM/EHSmm0JVxER8Rjwv23L+0fEC9X/luLaS04lvQ24JSKeKhRSp7p76FuKGwO8MMQ9L1L+Z9EXgO/0nEO0UaGTZ1zbbHCCamYjlqTtyfNdkLtokyW91HbbMmSJUDGdEmcH2ZNsjvT+tgT0MeCcqvnQX4C9yDO/RUnaKyJ6NUOqktONyfOoy5eJrC9Ju5LNfZaqXj8EfDsiTigaWIeIiO1KxzCCHAKcTO8u0zayddyMa5szTlDNbCT7DVkC1FPi+S967wx0k09jf1hvWH10Spyd4rPAwQPtjkbEM5IOIcfRFE9QgUmSXupJ8iS9keze+0Xg4qKRtZC0Azmu5xRyVut85NftdyTNiIgzC4bXUarmSHdVJdRI2pDsQvoIWa7YXkFRt4mSBkv8xtYWycC6hr7FRpiOmnFtc84JqpmNWBHxOFVrfEmvALtHxIyyUfXVKXF2kHHA34a458bqvibYHDi3muH4T/JBxCLk6JmflQyszV7AxIg4rmXt3GpEyl6AE9QhSFqEPB+3IbAKcIekbYDTyc65LwBflvSBtl2hOk0j558O577SfPZ5dOm0Gdc2h5ygmtmo0CmldZ0SZ8O9ALxpiHveDJQc5TFTRFwg6dPAL8luvmcDe0TEv8tG1scKwAX9rJ8PTKo5lk61H7AS8ElgajXT8Shy/vHa5NfuWcDXyR302kXEuBKfdw79VtLLQ91UsOGUzUUtM663I5vINX3Gtc0hJ6hmNipUIwkGfNrelDEEnRJnw11Hlvn+fZB7tgD+Wk84fUmar23p9+RO6i/Jst4neu6JiOGO05jXHiTnD7Y3+lmF3MmwoX0G2DMiLgCQtB7ZNffgiHi+WjsF+Gm5EDvKfcDzpYOw+kTEbZIOBZ6NiFcBJK1EViAcS5YBW4dzgmpmo8VO9E78xgArAlsD+xSJqH+dEmeTHQucL+nGiDiv/aKkrchGShvVHtksr9D/g4guslS2tVy2KQ8lzgJOqhLnq6q18cDx5K6vDe1d9C4/H09+HVzesnYPmbTa0HaLiEdLB2H1kDQ/8H1yB3UV4E5JmwI9M8JfAfaTtF5EPFkoTJsLnKCa2agQEf02GJJ0I7AlDTk/1ylxNllEXFI9YT9X0i1kx97Hye6P48l5oxMj4qpBPsy8tj2dd35uErAaeYayJ/YussnXgaWC6jAvAAu3vP4I8GBETG1ZWxqYXmtUZp1hd6oqBOABSV3AScBDwAfJYxuTyZ9HRWdI2+vjBNXMRrs/A6eWDmIYOiXORoiIwyX9GdgN+DTwVjJJvQrYJSKuKRzfj1tfS1oQWCIiHqxebwhc3bAZj6+SI2aOJM973Q7cGhF3FI2qs9wAfAq4XdJyZDOX09ru+SJDN/kyG422Js/nnwFQnUcdB+wTEY9Ua0eT44ecoHYwJ6hmNtp9HuiEUqBOibMxIuJP5DiURpO0MnAJ8HNmlXGfDTwlaZOIaD/zWStJSwNHkJ1dW3f/ngXOlnSQyyyH7UjgQkkfJnejX6YakyFpdeDLZPnix4pF2DnuxjNQR5sV6X3GdH2ymuOSlrU7ySoE62BOUM1sVJB0P31LKhclu71+rf6I+tcpcXYKScuSicBiZIJ/c0vXx6Y4FriGHKHQYwXgDDJ5+WSJoAAkLQNcS5byHgvcQpafLgasSY5H2lTS2g38e22ciLhU0seBnclZjcdExF3V5W3Jf+vtI+KSAT6EzbICOY5p5rzjqmrisz2VCDbivEbvM/nrAf+OiCkta28hH55ZB3OCamajRfvZzm7gJbKM8soC8QykU+JsNEmrAieQJZRdLZe6JV1GzpptSmnqB4A1I2LmucOIeFrS1yg/cP4wsjvmRq3xVc6TdARwBVlOt2/dwXWiiLgMuKyfS/uT5Yuddja5lK5+1t4HLFh3IFabW8ld0zslLU6e4f5l2z1bMHgHd+sATlDNbLToBk6PiPtLBzKETomzsaqRA1cB95Jdkdt3/b4EXCtpzbbmNKW8SHZtvatt/U2Ub6S0MbBtP8kpABExQ9LBwNE4QZ1jkk4iR824ZNVsYMcDP5K0GtkUaQxwHEB1pnsbYI/qd+tg7XPYzMxGqr2ABUoHMQydEmeTHUrOOF0rIk6LiBsiYmpE/C0iTgH+G7ie5iRUFwLfk6SeBUkrAt8FflcsqrQkeaZrMFOAZWuIZSTbinwgYWYDiIifA7sAa5PntzePiJ6GYvsBBwHfrO6zDuYdVDMbLa4h29N/q3QgQ+iUOJtsXWBCRLzc38WIeFXS4fQtpy5lH7Lk8x+SniF3TRclO77uVTIwcofihSHueZE8C2hzrr9yVRtafxUGpasObB6KiNOB0/u5dARZhfBEzSHZPOAE1cxGi+eAwyXtRz/dHyNifJGo+uqUOJtscWDaEPdMpSGdHiPicUlrkqNb3kueOb69OqtoZgM7UVLrA5QFgaOrBz0zRYRLPkc4N8YaWZygmtloMQM4s3QQw9ApcTbZG8hdvdRYd6IAAA+GSURBVMG8TIOaqUTEq8Dvq18zSRobEaU7Uk6UNNjZyLG1RTJyTQK88zN7riRL0Fv9hezi+pb6wzGzucUJqpmNChGxXekYhqNT4uwAHVPmJ2kJ4GBgVWaNUOgiE+iVyHLfUqaR80+Hc5/NuaOAVSU9FhEPlA6mE0TE+qVjMLN5wwmqmY06khYjW9HPB0yOiH8VDqlfnRJnQ7WX/rVbqLZIhvZ9cnTC74HPAWeTieka5OiRYiJiXMnPPxJJ2oI8WzwhIqZVDbF+B4wjxyCdDuwcEa8VDNPMrBgnqGY2oknaBdihenkq8Avgb+SbQYAjJK0fETcVCG+mTomzQ/RX+jfQfU3wUWDriLhQ0urAkRFxq6RTgVUKx2ZzkaRPAD8FJgPPV8unkV+vE4AnyeZduwLfKxGjmVlpTlDNbMSqGg0dSL4hfB74OrAt8ADZ6XV+8s3hAWTn3CI6Jc5O0Vr6J2kMsCI5A3U6cGd13rNJxjJrsPwdwOrkQPrjgYtKBWXzxO7ApIg4CGaOE1oHOCoifl2tHUjunDtBNbNRyQmqmY1kOwDbR8S5AJLOJudjbtLT8U/SAeQcypI6Jc6OIWlpcuzABGDhlkvPVn+/B0XEo0WC6+tBcqf8fuAu4H3V+vNkR2IbOdYAvtLyegPyvPT5LWs3kQ9VzMxGpflKB2BmNg+9E7iu50VEXE92b21t6HI/5Ts+dkqcHUHSMmSC/1HgWOCzwCbA/wEnApsB10t6e7EgezsPOFPSuuQ81C9I+hxwGJmw2sixEL1HR61LPoj4a9t9r9QWkZlZw3gH1cxGsgWYdc6rx0tk8tejm/IP6zolzk5xGPAwsFFETG+7dp6kI4ArgL2BfesOrh9fA8YAy0XEWZJ+BZwFPAVsXjQym9vuIbs1/1PSG4CNgSsjovV7fePqPjOzUclvdszMbKTZGNi/n+QUgIiYQY512azWqAb2dmCviDgLICJ2Apaofj1dMjCb684CjpE0gezevAR5vhwASR8mvzbPKROemVl53kE1s5FuoqTWkroxwJ6Snqxejy0QU386Jc5OsCRw5xD3TAGWrSGW4biXTFIf61mIiCckjQP+CCxSJiybB44CRCagrwHHRMR5AJK+C+wGXA4cUyxCM7PCnKCa2Ug2jWyS0+pf9N05m0ZZnRJnpxgDDDYDFeBFCiZ+krYHtqpedgGTJb3UdtsywCO1BmbzVES8BGxTjZXqjohnWi7/ijyDfGFEdBcJ0MysAZygmtmIFRHjSscwHJ0Sp81VvwHWJ5NTyAcSrUl1N3A7ORPTRpiI6FW6LeltwC0R8VShkMzMGsMJqpmZjUTtJdPtipZMR8TjwDYAkl4BdmtPWqpr7hUxgknalZxvvFT1+iHg2xFxQtHAzMwKcoJqZmYjTX8l0wPd1wTrkWXJvUh6B/B38kytjTCSdgCOBk4B/kQ2rlwf+I6kGRFxZsHwzMyKcYJqZmYjSieUTEv6OLBm9XJ54KuSnmm77T3A/LUGZnXaC5gYEce1rJ0raWp1zQmqmY1KTlDNzMzqdx9wMrPOoG5JdnXt0U2OmNm75risPisAF/Szfj4wqeZYzMwawwmqmZlZzSLiNuCdAJLuBd4fEf8uG5XV7EFgZeDutvVVgMfrD8fMrBmcoJqZmRUUEe8a6JqksRHxbJ3xWG3OAk6qGmFdVa2NB44Hzi4WlZlZYU5QzczMCpK0BHAwsCqzzpx2AQsCKwGLFgrN5q1JwGrAZLKkG/Lf/TfAgaWCMjMrzQmqmZlZWd8nu7f+HvgcuXu2ErAGsH+5sGwee5UcMXMksCE59/bWiLijaFRmZoV5vpqZmVlZHwW2jYitgACOjIg1gR+S5xFtBJG0tKQzgCeBW8ny3kOA04A9Jb2tZHxmZqV5B9XMzKysseS8U4A7gNXJxOV44KJSQdncJ2kZ4FqylPdY4BZgOrAYOXZoG2BTSWtHxMPFAjUzK8gJqpmZWVkPAuOA+4G7gPdV688DixeKyeaNw4CHgY0iYnrbtfMkHQFcQY4X2rfu4MzMmsAlvmZmZmWdB5wpaV3gMuALkj5HJjN3FY3M5raNgf37SU4BiIgZZMOszWqNysysQbyDamZmVtbXgDHAchFxlqRfkSNIngI2LxqZzW1LAncOcc8UYNkaYjEza6Su7u7uoe8yMzOz2khaHHgqIl4tHYvNPZJeA94eEY8Ocs9SwEMRMf9A95iZjWTeQTUzM2uYiHiidAxmZmYlOEE1MzMzq89ESc8Ncn1sbZGYmTWQE1QzMzOzekwDJgzzPjOzUclnUM3MzMzMzKwRvINqZmbWEFVzpPWARyPiL6XjMTMzq5t3UM3MzAqQdACwF/CBiJgq6f3AJcBi1S2XAZ+IiBdKxWhmZla3+UoHYGZmNtpI2g44BPgx8O9q+YfAS8AawLuAtwATS8RnZmZWihNUMzOz+u0ITIyIfSJiuqTVgFWBEyLi5oi4DzgM+HzRKM3MzGrmBNXMzKx+7wV+1/L6I0A3cHHL2hRg+TqDMjMzK80JqpmZWf3mB15ueb0uMAO4sWVtYcDnT83MbFRxgmpmZla/O4C1ACQtAmwEXB4Rr7Xc88nqPjMzs1HDY2bMzMzq9yPgOEnLkuW9iwInAUhaCJgA7A/sVyxCMzOzAryDamZmVrOIOBE4hUxA/xvYPSKuqC4fA/wEOAf4fpkIzczMyvAcVDMzswaRtCrQHRFTSsdiZmZWN5f4mpmZNYCkRYGVgBeBuwuHY2ZmVoR3UM3MzAqS1AUcBewKjKmWXwROioh9igVmZmZWgM+gmpmZlTUR2BE4gOzs+wHgEGBHSXuWDMzMzKxuLvE1MzMraydgt4g4o2XtekmPAV8Fji0TlpmZWf28g2pmZlbW0sBV/axfBYyrNxQzM7OynKCamZmVdS/woX7WPwQ8VHMsZmZmRbnE18zMrKxTgeMlvZVZO6njyXOoRxaLyszMrAAnqGZmZmV9jyzlPZL8/+Uu4GXgJOBb5cIyMzOrn8fMmJmZNUDLHFSA2yPi6ZLxmJmZleAdVDMzs4IkLQusBiwGTAducnJqZmajlXdQzczMCpC0KnACsA5Z1tujG7gM2D0i7igRm5mZWSnu4mtmZlYzSSuRDZHeRM5BXQt4D/B+4MvAUsC1kt5dLEgzM7MCvINqZmZWM0nnksnpZhHxcj/X5wd+B9wTETvXHZ+ZmVkp3kE1MzOr37rAof0lpwAR8SpwOPDRWqMyMzMrzAmqmZlZ/RYHpg1xz1Rg6RpiMTMzawwnqGZmZvV7A/DiEPe8DCxYQyxmZmaN4QTVzMysDDeBMDMza+M5qGZmZmWcKOmFQa4vVFskZmZmDeEE1czMrH5XAksO8z4zM7NRw2NmzMzMzMzMrBG8g2pmZlaQpDHAisBiwHTgzmrMjJmZ2ajjHVQzM7MCJC0NHAFMABZuufQscDZwcEQ8UiI2MzOzUpygmpmZ1UzSMsC1QBdwOnALuXu6GLAmsA3wCrB2RDxcKk4zM7O6OUE1MzOrmaQfAasCG0XE9H6uvwm4AvhDROxbd3xmZmaleA6qmZlZ/TYG9u8vOQWIiBnAwcBmtUZlZmZWmBNUMzOz+i0J3DnEPVOAZWuIxczMrDGcoJqZmdVvDPDCEPe8CCxSQyxmZmaN4QTVzMzMzMzMGsFzUM3MzMqYKOm5Qa6PrS0SMzOzhnCCamZmVr9p5PzT4dxnZmY2anjMjJmZmZmZmTWCz6CamZmZmZlZIzhBNTMzMzMzs0ZwgmpmZma1kdRVOgYzM2suN0kyMzPrIJL+CKzXtvwS8BBwMXBgRDwxDz7vOOBeYMeI+KGk9YE/ABtFxGXD/Bg7AKsCe8yFeL4OHAKMiYhXXu/HMzOzZvAOqpmZWee5FVi35dfHgBOB7YELatqlvKn63NfPxp85CFhi3oRjZmYjgXdQzczMOs+MiPhz29oVkhYGDgXWBq6dlwFExFNAewxmZmavixNUMzOzkeOG6vflJX2LnKP6BuATwK0R8UFJCwLfAD4PLAVMBY6MiDNaP5Ck7YF9gXHA38nEt/X6+rSV+EpaEzgM+BDwMvAnYN+IuEdSz1y75SVtGRFd1Z9ZGfg2WbY8H/BHYO+IiJbPtRhwFPC/wILAT4Gn5vhvyczMGsslvmZmZiOHqt+nVr9/DlgI+DQwqVo7D/gK8H0y4bsS+LGkL8/8INLOwGnAVcAE8mzrLwb9xNJq5I7qW4EdgZ2BlYBLJS1ClgM/DFxS/TeS3g1cDbwT2An4IrAM8BdJy1X3dAEXAZsDXwe2BlYA9pqNvxczM+sQ3kE1MzPrQJJa/z98cWA8cCCZ8N1YrXcB20bEjOrPbAj8D/CFiDizuuciSfMDh0s6HXiBbD7024jYqeWeV8jd0YF8DZgBbBARz1Sf7w4yuV0rIv4o6UXgsZby5K8DrwAf6WnsJOliMsE+kExyNyZ3ZD8dEZOrey4AbmNWQm5mZiOEE1QzM7PO82GyhLbVa8ClZJfdbkkA9/Ukp5WPVr//ti3BnUzueq5F7nK+o1prdRaDJ6jjgd/1JKcAEXEbuTs6kI+SJb0zWuJ5FriMTEwB1gdeBc5v+bivSjqHbLpkZmYjiBNUMzOzznMLWQ4L0E3uet7XmhxWHm573dNB98kBPu4yzEp8H2u79tAQMS0BPDLEPf39mQn0TbZpWXsr8GQ/o2SGisfMzDqQE1QzM7PO80xE3DD0bX1MB54ndzv7cy9ZLgzw9rZrQ42HmQ4s2b4oaRPg9oiYNsCf+QNw5CAf9zFgcUljIqI1kfW4GjOzEchNkszMzEaPPwILAwtExA09v4AVgcOBsRFxF/BPssFSq08N8bGvAjatRt0AM5sg/Q74SLX0aj/xrALc0hbPbmSXYciy5fmA/2v7s58cIh4zM+tA3kE1MzMbPS4mk8LJkiaRjYZWJ5sVXd2yyzkR+IWks4CfkUnkxCE+9mHANcAlko4l32McAvwD+GV1z3TgfZI+Su6cfoOc13qJpBPJ86fbkx17twaomitdCJwsaSkggO2Alef8r8HMzJrKO6hmZmajRES8RnbxPRPYG7gQ2IVZI2d67jsX+AyZmJ5HJotbDfGxbyJnmb4E/AQ4AbiJnJP6bHXbJLJ0+DfAOyNiCrAOmZj+CDgXWB74v4j4acuH3xz4AZkkn0PuxH5zTv4OzMys2bq6u7uHvsvMzMzMzMxsHvMOqpmZmZmZmTWCE1QzMzMzMzNrBCeoZmZmZmZm1ghOUM3MzMzMzKwRnKCamZmZmZlZIzhBNTMzMzMzs0ZwgmpmZmZmZmaN4ATVzMzMzMzMGsEJqpmZmZmZmTXC/welGA2LpNPGjwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1008x504 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import seaborn as sns\n",
    "\n",
    "df_cm =  pd.crosstab(y_actu, y_pred, rownames=['Actual'], colnames=['Predicted'],\n",
    "                           dropna=False, margins=False, normalize='index').round(4)\n",
    "plt.figure(figsize = (14,7))\n",
    "sns.set(font_scale=1.4)\n",
    "sns.heatmap(df_cm, cmap=\"Blues\", annot=True, annot_kws={\"size\": 16})\n",
    "b, t = plt.ylim()\n",
    "b += 0.5\n",
    "t -= 0.5\n",
    "plt.ylim(b, t)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Important features\n",
    "\n",
    "We can see the degree of contribution of each feature to the classification result by using the __feature\\_importances\\___ attribute of the Random Forest Classifier. We see here that, as mentioned in the paper, the 10 features extracted from our Adaptive Clustering network consistute the 10 most important features for the classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculating feature importance scores...\n",
      "Feature importance scores saved: ./demo_results/rf_feature_importance_scores.pkl\n",
      "\n",
      "15 most important features\n",
      "[[132, 'kernel_feature_5', 0.08178318461007863],\n",
      " [130, 'kernel_feature_3', 0.07565589316895451],\n",
      " [133, 'kernel_feature_6', 0.07246143605439102],\n",
      " [131, 'kernel_feature_4', 0.07058038540371375],\n",
      " [136, 'kernel_feature_9', 0.06855118911590024],\n",
      " [134, 'kernel_feature_7', 0.06495256484992366],\n",
      " [128, 'kernel_feature_1', 0.061312813711989],\n",
      " [129, 'kernel_feature_2', 0.058819080203644805],\n",
      " [127, 'kernel_feature_0', 0.05493784130054764],\n",
      " [135, 'kernel_feature_8', 0.05281658873364255],\n",
      " [69, 'payload_feature_30', 0.021296088569098],\n",
      " [80, 'payload_feature_41', 0.02048442810056399],\n",
      " [112, 'Init Fwd Win Byts', 0.018483005609833966],\n",
      " [46, 'payload_feature_7', 0.01647526842298469],\n",
      " [118, 'Fwd Seg Size Min', 0.016135304627073335]]\n",
      "Sum 15: 0.7547450724823399\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"Calculating feature importance scores...\")\n",
    "importances = model.classifier.cls.feature_importances_\n",
    "indices = np.argsort(importances)[-50:][::-1]  # -50 #most important features\n",
    "cols = test_df.columns.values.tolist()\n",
    "\n",
    "feature_importances_list = []\n",
    "for f in range(len(indices)):\n",
    "    feature_importances_list.append([indices[f], cols[indices[f]], importances[indices[f]]])\n",
    "\n",
    "with open(results_path + \"rf_feature_importance_scores.pkl\", \"wb\") as f:\n",
    "    pkl.dump(feature_importances_list, f)\n",
    "    print(f\"Feature importance scores saved: {results_path}rf_feature_importance_scores.pkl\")\n",
    "\n",
    "    print(\"\")\n",
    "    print(\"15 most important features\")\n",
    "    pprint(feature_importances_list[:15])\n",
    "    print(\"Sum 15:\", np.sum(importances[indices[:15]]))\n",
    "    print(\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Performance metrics\n",
    "\n",
    "Finally, we compute the different performance metrics on our test set. We can see here again that this approach allows us to obtain a perfect score on every single evaluation metric, making this the new state-of-the-art approach for classification tasks."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Calculating performance metrics...\n",
      "Accuracy : 1.0000, Precision : 1.0000, Recall : 1.0000, F-score : 1.0000, FAR: 0.0000\n",
      "Performance metrics saved: ./demo_results/metrics_handler.pkl\n",
      "--------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "print(\"Calculating performance metrics...\")\n",
    "cnf_matrix = confusion_matrix(y_actual_, y_hat)\n",
    "_fp = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)\n",
    "_fn = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)\n",
    "_tp = np.diag(cnf_matrix)\n",
    "_tn = cnf_matrix.sum() - (_fp + _fn + _tp)\n",
    "\n",
    "_fp = _fp.astype(float)\n",
    "_fn = _fn.astype(float)\n",
    "_tp = _tp.astype(float)\n",
    "_tn = _tn.astype(float)\n",
    "\n",
    "_fp = np.mean(_fp)\n",
    "_fn = np.mean(_fn)\n",
    "_tp = np.mean(_tp)\n",
    "_tn = np.mean(_tn)\n",
    "\n",
    "metrics_handler = metrics(tp=_tp, tn=_tn, fp=_fp, fn=_fn)\n",
    "metrics_data = metrics_handler.get_metrics()\n",
    "\n",
    "accuracy = accuracy_score(y_actual_, y_hat)\n",
    "precision, recall, f_score, support = prf(y_actual_, y_hat, average='weighted')\n",
    "print(\"Accuracy : {:0.4f}, Precision : {:0.4f}, Recall : {:0.4f}, F-score : {:0.4f}, FAR: {:0.4f}\"\n",
    "                                                      .format(accuracy, precision,\n",
    "                                                              recall, f_score, metrics_data[\"FAR\"]))\n",
    "\n",
    "with open(results_path + \"metrics_handler.pkl\", \"wb\") as f:\n",
    "    pkl.dump(metrics_handler, f)\n",
    "    print(f\"Performance metrics saved: {results_path}metrics_handler.pkl\")\n",
    "\n",
    "print(separator)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Putting it all together\n",
    "\n",
    "<p style=\"font-size: 1.2em; line-height: 1.2em;\">We have implemented our approach and obtained a striking state-of-the-art performance by producing a <b>100%</b> success rate with <b>zero</b> false alarms on the CSE-CIC-IDS 2018 intrusion detection dataset. We have also shown that the features learned from the proposed classifier-agnostic Adaptive Clustering network constitute the features that participate the most to the decision process of the final classifier.</p>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
